Android 活用RecyclerView分割线

1.前言 RecyclerVIew是我们日常开发中使用频率最高的控件了吧,之前由于比较马虎没好好整理过如何添加分割线,以前是通过文件或者在布局里投机取巧进行添加,现如今有空有必要好好的整理一番了。宏观把控Recycyerview.ItemDecoration实现的方法public class MyDecoration extends RecyclerView.ItemDecor...
摘要由CSDN通过智能技术生成

1、ItemDecoration简介

    Recyclerview是我们日常开发中使用频率比较高的的控件,而其中的ItemDecoration作为布局装饰又能很方便的帮助我们定义分割线,列表排行效果以及设置布局悬浮置顶效果等,所以有必要去了解ItemDecoration的诸多细节。

2、基本原理

 我们先关注下实现RecyclerView.ItemDecoration必须要实现的三个方法,#getItemOffsets()用于在Item周围设置上下左右的间隙,然后我们可以使用#onDraw()在间隙绘制分割线以及其他图案等;而#onDrawOver()则是在RecyclerView布局上面绘制图案

public class MyDecoration extends RecyclerView.ItemDecoration{
    /**
     * step1 相当于itemView外还有一个矩形,我们可以自由在itemview上下左右设置空余部分,
通过outRect 的left,top,right,bottom 来进行设置,我们可在这块控件进行绘制
     * 目标针对每一个item个体
     */
    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
    }

    /**
     * step2 在item间绘制  常用于绘制分割线
     * 针对整个Recyclerview 绘制需要循环遍历item子布局 然后方能针对具体的item进行增加绘制
     */
    @Override
    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDraw(c, parent, state);
    }

    /**
     * 在item上绘制
     */
    @Override
    public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
    }
}

2.1 getItemoffsets在RecyclerView源码中作用时机

manager#getItemDecorInsetsForChild

为指定view计算分割线矩形

    Rect getItemDecorInsetsForChild(View child) {
        RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams)child.getLayoutParams();
        if (!lp.mInsetsDirty) {
            return lp.mDecorInsets;
        } else if (this.mState.isPreLayout() && (lp.isItemChanged() || lp.isViewInvalid())) {
            return lp.mDecorInsets;
        } else {
            Rect insets = lp.mDecorInsets;
            insets.set(0, 0, 0, 0);
            int decorCount = this.mItemDecorations.size();

            for(int i = 0; i < decorCount; ++i) {
                this.mTempRect.set(0, 0, 0, 0);
                ((RecyclerView.ItemDecoration)this.mItemDecorations.get(i)).getItemOffsets(this.mTempRect, child, this, this.mState);
                insets.left += this.mTempRect.left;
                insets.top += this.mTempRect.top;
                insets.right += this.mTempRect.right;
                insets.bottom += this.mTempRect.bottom;
            }

            lp.mInsetsDirty = false;
            return insets;
        }
    }

        // 测量的时候 当作padding值放入其中
        public void measureChild(@NonNull View child, int widthUsed, int heightUsed) {
            RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams)child.getLayoutParams();
            Rect insets = this.mRecyclerView.getItemDecorInsetsForChild(child);
         
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
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。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值