Home » Android » android – How to Skip First Row in RecyclerView Item Decoration for GridLayout?

android – How to Skip First Row in RecyclerView Item Decoration for GridLayout?

Posted by: admin May 14, 2020 Leave a comment

Questions:

I’m using this ItemDecoration class for GridLayout -> https://github.com/devunwired/recyclerview-playground/blob/master/app/src/main/java/com/example/android/recyclerplayground/GridDividerDecoration.java

But the problem is, my first row in GridLayout is an image and I set the span to 2.

You can view my screen as per screenshot below :

Screenshot

How to skip the first row so that ItemDecoration didn’t draw on the Image?

Below is the code that I’m using to add the ItemDecoration :-

mRecyclerView.setHasFixedSize(true);
mLayoutManager = new GridLayoutManager(getActivity(), 2);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return position == 0 ? 2 : 1;
    }
});
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter.setHighlightsCallbacks(this);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.addItemDecoration(new GridDividerDecoration(getActivity()));

I also modified the drawHorizontal method in GridDividerDecoration class to only draw if imageview is null but still not working :-

public void drawHorizontal(Canvas c, RecyclerView parent) {

    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();

    final int childCount = parent.getChildCount();

    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        if (child.findViewById(R.id.home_imgHeader) == null) {
            final RecyclerView.LayoutParams params =
                    (RecyclerView.LayoutParams) child.getLayoutParams();
            final int left = child.getRight() + params.rightMargin + mInsets;
            final int right = left + mDivider.getIntrinsicWidth();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }
}

Any help?

How to&Answers:

Assuming your items don’t individually have solid backgrounds (i.e. the white color is from the parent), the simplest fix would be to move the code from onDrawOver() to onDraw(). This will draw the gridlines underneath your child view contents and it will be hidden under the header image.

Otherwise, the code you are using assumes that the grid lines are always drawn to the top of the view in drawHorizontal() (notice top is a value that never changes). You would need to modify that function to account for the bottom of the first item and start drawing there. Something like:

public void drawHorizontal(Canvas c, RecyclerView parent) {
    final View topView = parent.findViewHolderForAdapterPosition(0);
    int viewBottom = -1;
    if (topView != null) {
        final RecyclerView.LayoutParams params =
            (RecyclerView.LayoutParams) child.getLayoutParams();
        viewBottom = child.getBottom() + params.bottomMargin + mInsets;
    }

    final int top = viewBottom > parent.getPaddingTop() ? viewBottom : parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();

    … /* Remaining Code */
}