Decorating RecyclerView (with GridLayoutManager) to display divider between items

后端 未结 9 1486
旧时难觅i
旧时难觅i 2020-12-07 09:44

What\'s the best and easiest way to decorate RecyclerView to have such look & feel?

\"enter

9条回答
  •  孤城傲影
    2020-12-07 10:06

      @BindingAdapter({"bind:adapter"})
        public static void bind(RecyclerView view, RecyclerView.Adapter adapter) {
            view.setLayoutManager(new GridLayoutManager(view.getContext(), 3));
            view.addItemDecoration(new SpacesItemDecorationGrid(view.getContext(), 4, 3));
            view.setItemAnimator(new DefaultItemAnimator());
            view.setAdapter(adapter);
        }
    
    
    public class SpacesItemDecorationGrid extends RecyclerView.ItemDecoration {
    
        private int mSizeGridSpacingPx;
        private int mGridSize;
        private boolean mNeedLeftSpacing = false;
    
        /**
         * @param gridSpacingPx
         * @param gridSize
         */
        SpacesItemDecorationGrid(Context context, int gridSpacingPx, int gridSize) {
            mSizeGridSpacingPx = (int) Util.convertDpToPixel(gridSpacingPx, context);
            mGridSize = gridSize;
        }
    
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            int frameWidth = (int) ((parent.getWidth() - (float) mSizeGridSpacingPx * (mGridSize - 1)) / mGridSize);
            int padding = parent.getWidth() / mGridSize - frameWidth;
            int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewAdapterPosition();
            int itemCount = parent.getAdapter().getItemCount() - mGridSize;
    
    
       /*     if (itemPosition < mGridSize) {
                outRect.top = mSizeGridSpacingPx;
            } else {
                       outRect.top = mSizeGridSpacingPx;
            }*/
            outRect.top = mSizeGridSpacingPx;
            if (itemPosition % mGridSize == 0) {
                outRect.left = mSizeGridSpacingPx;
                outRect.right = padding;
                mNeedLeftSpacing = true;
            } else if ((itemPosition + 1) % mGridSize == 0) {
                mNeedLeftSpacing = false;
                outRect.right = mSizeGridSpacingPx;
                outRect.left = padding;
            } else if (mNeedLeftSpacing) {
                mNeedLeftSpacing = false;
                outRect.left = mSizeGridSpacingPx - padding;
                if ((itemPosition + 2) % mGridSize == 0) {
                    outRect.right = mSizeGridSpacingPx - padding;
                } else {
                    outRect.right = mSizeGridSpacingPx / 2;
                }
            } else if ((itemPosition + 2) % mGridSize == 0) {
                mNeedLeftSpacing = false;
                outRect.left = mSizeGridSpacingPx / 2;
                outRect.right = mSizeGridSpacingPx - padding;
            } else {
                mNeedLeftSpacing = false;
                outRect.left = mSizeGridSpacingPx / 2;
                outRect.right = mSizeGridSpacingPx / 2;
            }
            if (itemPosition > itemCount) {
                outRect.bottom = mSizeGridSpacingPx;
            } else {
                outRect.bottom = 0;
            }
    
        }
    
    }
    

提交回复
热议问题