How to add dividers and spaces between items in RecyclerView?

前端 未结 30 3369
清歌不尽
清歌不尽 2020-11-22 03:27

This is an example of how it could have been done previously in the ListView class, using the divider and dividerHeight parame

30条回答
  •  独厮守ぢ
    2020-11-22 04:14

    This link worked like a charm for me:

    https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36

    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.AttributeSet;
    import android.view.View;
    
    public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    
        private Drawable mDivider;
        private boolean mShowFirstDivider = false;
        private boolean mShowLastDivider = false;
    
    
        public DividerItemDecoration(Context context, AttributeSet attrs) {
            final TypedArray a = context
                    .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
            mDivider = a.getDrawable(0);
            a.recycle();
        }
    
        public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
                boolean showLastDivider) {
            this(context, attrs);
            mShowFirstDivider = showFirstDivider;
            mShowLastDivider = showLastDivider;
        }
    
        public DividerItemDecoration(Drawable divider) {
            mDivider = divider;
        }
    
        public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
                boolean showLastDivider) {
            this(divider);
            mShowFirstDivider = showFirstDivider;
            mShowLastDivider = showLastDivider;
        }
    
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
                RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
            if (mDivider == null) {
                return;
            }
            if (parent.getChildPosition(view) < 1) {
                return;
            }
    
            if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
                outRect.top = mDivider.getIntrinsicHeight();
            } else {
                outRect.left = mDivider.getIntrinsicWidth();
            }
        }
    
        @Override
        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
            if (mDivider == null) {
                super.onDrawOver(c, parent, state);
                return;
            }
    
            // Initialization needed to avoid compiler warning
            int left = 0, right = 0, top = 0, bottom = 0, size;
            int orientation = getOrientation(parent);
            int childCount = parent.getChildCount();
    
            if (orientation == LinearLayoutManager.VERTICAL) {
                size = mDivider.getIntrinsicHeight();
                left = parent.getPaddingLeft();
                right = parent.getWidth() - parent.getPaddingRight();
            } else { //horizontal
                size = mDivider.getIntrinsicWidth();
                top = parent.getPaddingTop();
                bottom = parent.getHeight() - parent.getPaddingBottom();
            }
    
            for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
                View child = parent.getChildAt(i);
                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    
                if (orientation == LinearLayoutManager.VERTICAL) {
                    top = child.getTop() - params.topMargin;
                    bottom = top + size;
                } else { //horizontal
                    left = child.getLeft() - params.leftMargin;
                    right = left + size;
                }
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
    
            // show last divider
            if (mShowLastDivider && childCount > 0) {
                View child = parent.getChildAt(childCount - 1);
                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
                if (orientation == LinearLayoutManager.VERTICAL) {
                    top = child.getBottom() + params.bottomMargin;
                    bottom = top + size;
                } else { // horizontal
                    left = child.getRight() + params.rightMargin;
                    right = left + size;
                }
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        }
    
        private int getOrientation(RecyclerView parent) {
            if (parent.getLayoutManager() instanceof LinearLayoutManager) {
                LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
                return layoutManager.getOrientation();
            } else {
                throw new IllegalStateException(
                        "DividerItemDecoration can only be used with a LinearLayoutManager.");
            }
        }
    }
    

    Then in your activity:

    mCategoryRecyclerView.addItemDecoration(
        new DividerItemDecoration(this, null));
    

    Or this if you are using a fragment:

    mCategoryRecyclerView.addItemDecoration(
        new DividerItemDecoration(getActivity(), null));
    

提交回复
热议问题