Search code examples
androidgridviewandroid-recyclerviewgridlayoutmanager

Android Recyclerview GridLayoutManager column spacing


How do you set the column spacing with a RecyclerView using a GridLayoutManager? Setting the margin/padding inside my layout has no effect.


Solution

  • RecyclerViews support the concept of ItemDecoration: special offsets and drawing around each element. As seen in this answer, you can use

    public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
      private int space;
    
      public SpacesItemDecoration(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;
    
        // Add top margin only for the first item to avoid double space between items
        if (parent.getChildLayoutPosition(view) == 0) {
            outRect.top = space;
        } else {
            outRect.top = 0;
        }
      }
    }
    

    Then add it via

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
    int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.spacing);
    mRecyclerView.addItemDecoration(new SpacesItemDecoration(spacingInPixels));