Decorating RecyclerView (with GridLayoutManager) to display divider between items

后端 未结 9 1452
旧时难觅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 09:56

    I don't know why do you need that, but this UI is quite easy to implement with RecyclerView decorator.

    
    3
    
    
    10dp
    

    You can change photo_list_preview_columns and photos_list_spacing according to your needs.

    mRecylerView.addItemDecoration(new ItemDecorationAlbumColumns(
        getResources().getDimensionPixelSize(R.dimen.photos_list_spacing), 
        getResources().getInteger(R.integer.photo_list_preview_columns)));
    

    and decorator (needs some refatoring)

    import android.graphics.Rect;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    
    public class ItemDecorationAlbumColumns extends RecyclerView.ItemDecoration {
    
        private int mSizeGridSpacingPx;
        private int mGridSize;
    
        private boolean mNeedLeftSpacing = false;
    
        public ItemDecorationAlbumColumns(int gridSpacingPx, int gridSize) {
            mSizeGridSpacingPx = gridSpacingPx;
            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();
            if (itemPosition < mGridSize) {
                outRect.top = 0;
            } else {
                outRect.top = mSizeGridSpacingPx;
            }
            if (itemPosition % mGridSize == 0) {
                outRect.left = 0;
                outRect.right = padding;
                mNeedLeftSpacing = true;
            } else if ((itemPosition + 1) % mGridSize == 0) {
                mNeedLeftSpacing = false;
                outRect.right = 0;
                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;
            }
            outRect.bottom = 0;
        }
    }
    

    enter image description here enter image description here

提交回复
热议问题