RecyclerView的分割线:ItemDecoration

使用ListView时,设置分割线很容易,但是用RecyclerView就会麻烦一点。一般都需要重写ItemDecoration,并给RecyclerView设置ItemDecoration。下面来介绍一下ItemDecoration中几个比较重要的方法。

  • getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)

    Retrieve any offsets for the given item. Each field of outRect specifies the number of pixels that the item view should be inset by, similar to padding or margin.The default implementation sets the bounds of outRect to 0 and returns.

设置分割线所占的大小,给分割线预留位置。

  • onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)

    Draw any appropriate decorations into the Canvas supplied to the RecyclerView.Any content drawn by this method will be drawn before the item views are drawn,and will thus appear underneath the views.

在RecyclerView的item被draw之前,为RecyclerView设置装饰(一般都是指分割线),所以此种情况下当getItemOffsets设置过小,分割线会被item遮住。

  • onDrawOver(Canvas c, RecyclerView parent, State state)

    Draw any appropriate decorations into the Canvas supplied to the RecyclerView.Any content drawn by this method will be drawn after the item views are drawn,and will thus appear over the views.

在RecyclerView的item被draw之后,为RecyclerView设置装饰(一般都是指分割线),所以此种情况下当getItemOffsets设置过小,分割线会遮住item的内容。


下面贴上一个自定义分割线的代码,

RecyclerView mRecyclerView=findViewById();
    mRecyclerView.addItemDecoration(new DividerItemDecoration(getResources().getColor(R.color.s5)
                    , 1, LinearLayoutManager.VERTICAL);
    public class DividerItemDecoration extends RecyclerView.ItemDecoration {

        private Paint mPaint;
        private int mColor;
        private int mDividerSize;
        private int mOrientation;

        //分割线与两边的距离
        private float mStartMargin;
        private float mEndMargin;

        public DividerItemDecoration(int color, int dividerSize, int orientation) {
            this(color, dividerSize, orientation, 0, 0);
        }

        public DividerItemDecoration(int color, int dividerSize, int orientation, float startMargin, float endMargin) {
            mColor = color;
            mDividerSize = dividerSize;
            mOrientation = orientation;
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setColor(mColor);
            mPaint.setStyle(Paint.Style.FILL);
            mStartMargin = startMargin;
            mEndMargin = endMargin;
        }

        @Override
        public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
            if (mOrientation == LinearLayoutManager.VERTICAL) {
                drawVerticalDivider(c, parent);
            } else {
                drawHorizontalDivider(c, parent);
            }
        }

      //水平的list,画竖直的分割线
        private void drawHorizontalDivider(Canvas c, RecyclerView parent) {
            int top = 0;
            int bottom = parent.getMeasuredHeight();
            int childCount = parent.getChildCount();
            for (int i = 0; i < childCount; i++) {
                View child = parent.getChildAt(i);
                int pos = parent.getChildAdapterPosition(child);
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                int left = child.getLeft() + layoutParams.leftMargin;
                int right = top + mDividerSize;
                c.drawRect(left, top + mStartMargin
                        , right, bottom - mEndMargin, mPaint);
            }
        }

      //竖直的list,画水平的分割线
        private void drawVerticalDivider(Canvas c, RecyclerView parent) {
            final int left = 0;
            final int right = parent.getMeasuredWidth();
            int childCount = parent.getChildCount();
            for (int i = 0; i < childCount; i++) {
                final View child = parent.getChildAt(i);
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                final int top = child.getTop() + layoutParams.topMargin;
                final int bottom = top + mDividerSize;
                c.drawRect(left + mStartMargin, top
                        , right - mEndMargin, bottom, mPaint);
            }
        }

      //设置分割线展位大小
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            int pos = parent.getChildAdapterPosition(view);
            if (mOrientation == LinearLayoutManager.VERTICAL) {
                outRect.set(0, 0, 0, mDividerSize);
            } else {
                outRect.set(0, 0, mDividerSize, 0);
            }
        }

    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView分割线可以通过设置ItemDecoration来实现。下面是一个示例代码: 首先,创建一个分割线的类,继承自RecyclerView.ItemDecoration: ```java public class DividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecoration(Context context) { // 获取系统默认的分割线Drawable TypedArray styledAttributes = context.obtainStyledAttributes(new int[]{android.R.attr.listDivider}); mDivider = styledAttributes.getDrawable(0); styledAttributes.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int top = child.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } ``` 然后,在使用RecyclerView的地方,添加分割线: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.addItemDecoration(new DividerItemDecoration(this)); ``` 这样就可以在RecyclerView的每个Item之间添加一个默认的分割线了。如果需要自定义分割线的样式,可以修改DividerItemDecoration类中的绘制逻辑或者使用其他Drawable替代mDivider

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值