Set height & gravity of Span item in GridLayoutManager
Asked Answered
T

0

0

I'm working with Grid Layout Manager in Recycler View.

I can :

  • show one View Group inside Grid Layout like image below.

  • Able to set Space Item Decoration

  • Able to set different Span Size Lookup.

enter image description here

My issue is :

  • Not able to set Height of each Span row inside, as 5 small circles in above image. (I want to set smaller height)

  • The span item can not set gravity to center when it stay alone, as Big circle in above image

I tried to find method setFullSize() (exists when working with StaggerGridLayoutManager) in GridLayoutManager but looks like not useful.

People who know how to solve my issues,

Please tell me how to able do that,

Thank you,

p/s : Following coding show you :

.xml

<com.example.huy.customgridlayout.ScalingLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_item_"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
>

<ImageView
    android:id="@+id/iv_"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/red_circle_256x256"
    android:scaleType="centerInside"/>

<TextView
    android:id="@+id/topic"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="90dp"
    android:textColor="@android:color/white"
    android:textSize="16sp"
    android:text="Topic"/>

<TextView
    android:id="@+id/comment_mumber"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/topic"
    android:layout_centerHorizontal="true"
    android:textSize="24sp"
    android:textColor="@android:color/white"
    android:text="594"/>

<TextView
    android:id="@+id/comment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/comment_mumber"
    android:layout_centerHorizontal="true"
    android:textSize="18sp"
    android:textColor="@android:color/white"
    android:text="Comments"/>

<TextView
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/comment"
    android:layout_centerHorizontal="true"
    android:gravity="center"
    android:textSize="12sp"
    android:textColor="@android:color/white"
    android:text="New! \n 2016/12/06 15:02"/>

</com.example.huy.customgridlayout.ScalingLayout>

ScalingLayout.java

public class ScalingLayout extends RelativeLayout {

private float scale = 1;

public ScalingLayout(Context context) {
    super(context);
    setWillNotDraw(false);
}

public ScalingLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public ScalingLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

public void setScale(float factor){
    scale = factor;
    invalidate();
}
public float getScale(){
    return scale;
}

@Override
public void onDraw(Canvas canvas){
    canvas.scale(scale, scale);
    super.onDraw(canvas);
}

}

MainActivity.java

private GridLayoutManager mLayoutManager;
private RecyclerView mRecyclerView;

private final String[] topics = new String[]{
        "Rain", // 1
        "Hot weather", // 2
        "Cold weather", // 3
        "Cool", // 4
        "Fall", // 5
        "Rain", // 1
        "Hot weather", // 2
        "Cold weather", // 3
        "Cool", // 4
        "Fall", // 5
        "Rain", // 1
        "Hot weather", // 2
        "Cold weather", // 3
        "Cool", // 4
        "Fall", // 5
        "Cool", // 4
        "Fall", // 5
};

private final int[] comment = new int[]{
        100, // 3
        200, // 4
        300, // 1
        400, // 5
        500, // 2
        600, // 6
        700, // 7
        1005, // 8
        290, // 9
        420, // 10
        20, // 11
        30, // 12
        40, // 13
        50, // 14
        60, // 15
        70, // 15
        80, // 15
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);

    int put = 5;

    mLayoutManager = new GridLayoutManager(this, put, GridLayoutManager.VERTICAL, false);

    mRecyclerView.setLayoutManager(mLayoutManager);

    SpacesItemDecoration decoration = new SpacesItemDecoration(-40);
    mRecyclerView.addItemDecoration(decoration);

    mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int pos) {

            // SET SPAN COLUMN IN HERE, RETURN ONE OF 5 COLUMNS I ALREADY SET IN ABOVE
            if (0 <= comment[pos] && comment[pos] < 150)
                return 1;
            else if (150 <= comment[pos] && comment[pos] < 300)
                return 2;
            else if (300 <= comment[pos] && comment[pos] < 450)
                return 3;
            else if (450 <= comment[pos] && comment[pos] < 600)
                return 4;
            else if (600 <= comment[pos])
                return 5;
            else return -1;

        }
    });

    ArrayList<Topic> mAa = new ArrayList<>();
    for (int i = 0; i < comment.length; i++) {
        mAa.add(new Topic(comment[i], topics[i]));
    }

    GridLayoutAdapter adapter = new GridLayoutAdapter(this, mAa);
    mRecyclerView.setAdapter(adapter);
}

Adapter.java

public class GridLayoutAdapter extends CustomRecyclerViewAdapter {

    private Activity activity;
    private List<Topic> topics;
//    private int screenWidth;

    public GridLayoutAdapter(Activity activity, List<Topic> images) {
        this.activity = activity;
        this.topics = images;

//        WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
//        Display display = wm.getDefaultDisplay();
//        Point size = new Point();
//        display.getSize(size);
//        screenWidth = size.x;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(activity)
                .inflate(R.layout.scaling_layout_item, parent, false);

        return new Holder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        final Holder myHolder = (Holder) holder;

        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;

        BitmapFactory.decodeFile(topics.get(position).getTopic(), opts);
        opts.inJustDecodeBounds = false;

//        if (topics.get(position).getComment() < 100)
//            hideItemContent(myHolder);

        myHolder.mTvTopic.setText(topics.get(position).getTopic());
        myHolder.mTvCommentNumber.setText(String.valueOf(topics.get(position).getComment()));
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return topics.size();
    }

    private void hideItemContent(Holder myHolder) {
        myHolder.mTvComment.setVisibility(View.GONE);
        myHolder.mTvCommentNumber.setVisibility(View.GONE);
        myHolder.mTvDate.setVisibility(View.GONE);
        myHolder.mTvTopic.setVisibility(View.GONE);
    }

    public class Holder extends RecyclerView.ViewHolder {

        private ScalingLayout mRl;

        private TextView mTvComment;
        private TextView mTvCommentNumber;
        private TextView mTvDate;
        private TextView mTvTopic;

        public Holder(View itemView) {
            super(itemView);

            mRl = (ScalingLayout) itemView.findViewById(R.id.rl_item_);

            mTvComment = (TextView) itemView.findViewById(R.id.comment);
            mTvCommentNumber = (TextView) itemView.findViewById(R.id.comment_mumber);
            mTvDate = (TextView) itemView.findViewById(R.id.date);
            mTvTopic = (TextView) itemView.findViewById(R.id.topic);
        }
    }
}
Tunny answered 27/12, 2016 at 3:24 Comment(4)
I'm a little bit losing myself on the criteria used for determining colspan. As far as I understood you want first item to fill the whole horizontal grid space, while the following items should fill one column each, right?Clincher
No, it's random. It depends on the range comments number I set so It can be filled respectively.Tunny
Ok, so basically your expectation is also to have some blank space beside an item in case the following one cannot fit the remaining space, right?Clincher
I want set small height to remove big blank space. Actually I know how to do that already. Still not push answer yet, set the height via LayoutParam inside onBindViewHolder of adapter should work.Tunny

© 2022 - 2024 — McMap. All rights reserved.