Decoration spacing and span with GridLayoutManger in RecyclerVIew

198 views Asked by At

I am trying to implement this kind of RecyclerView by using GridLayoutMangaer as its layout. However, I am facing the issue while implementing the item spacing for each item in the grid.

My aim is to have an implementation like image below

Please click on this link to preview image

Any solutions for this kind of implementation would be appreciated

1

There are 1 answers

4
G.Ronak On
        public class GridRec extends RecyclerView.ItemDecoration {
          private int space;
        
          public GridRec(int space) {
            this.space = space;
          }
        
          @Override
          public void getItemOffsets(Rect outRect, View view, 
              RecyclerView parent, RecyclerView.State state) {
            outRect.left = space;
            outRect.right = space;
            outRect.bottom = space;
        
            if (parent.getChildLayoutPosition(view) == 0) {
                outRect.top = space;
            } else {
                outRect.top = 0;
            }
          }
        }
        
        
        int my_space = getResources().getDimension(R.dimen.test);
        myRecyclerView.addItemDecoration(new GridRec(my_space));
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    -----------------------------------------------------------
    
 


public class abc extends RecyclerView.ItemDecoration {

    private int myPadding_psx;
    private int myPadding_edge_psx;

    public abc(Activity activity) {
        final Resources resources = activity.getResources();
        myPadding_psx = (int) resources.getDimension(R.dimen.myDefault);
        myPadding_edge_psx = (int) resources.getDimension(R.dimen.mYDefaultEdge);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        final int itemPosition = parent.getChildAdapterPosition(view);
        if (itemPosition == RecyclerView.NO_POSITION) {
            return;
        }
        int orientation = getOrientation(parent);
        final int itemCount = state.getItemCount();

        int left = 0;
        int top = 0;
        int right = 0;
        int bottom = 0;

        //Horizontal
        if (orientation == LinearLayoutManager.HORIZONTAL) {
            left = myPadding_psx;
            right =myPadding_psx;

            if (itemPosition == 0) {
                left += myPadding_edge_psx;
            }

            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                right += myPadding_edge_psx;
            }
        }

        //Vertical
        else {
            top = myPadding_psx;
            bottom = myPadding_psx;

            if (itemPosition == 0) {
                top += myPadding_edge_psx;
            }
            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                bottom += myPadding_edge_psx;
            }
        }

        if (!isReverseLayout(parent)) {
            outRect.set(left, top, right, bottom);
        } else {
            outRect.set(right, bottom, left, top);
        }
    }

    private boolean isReverseLayout(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getReverseLayout();
        } else {
            throw new IllegalStateException("Error.");
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException("Error.");
        }
    }
}