【Code-Snippet】RecyclerView

1. 经常使用设置

  • 滚动条设置:android:scrollbars="none"
  • 波浪设置:android:overScrollMode="never"

2. 基本写法

参考java

  • 基本写法
  • 多种不一样的item
  • 设置点击事件

ItemDecoration

  1. 小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践android

  2. RecyclerView探索之经过ItemDecoration实现StickyHeader效果git

继承:itemDecoration,重写里面的方法:github

public class MyItemDecoration extends RecyclerView.ItemDecoration {

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
    }

    @Override
    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDraw(c, parent, state);
    }

    @Override
    public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
    }
}
复制代码
  • getItemOffsets(Rect outRect, View view, RecyclerView parent, @NonNull RecyclerView.State state)bash

    outRect 是一个全为 0 的 Rect。view 指 RecyclerView 中的 Item。parent 就是 RecyclerView 自己,state 就是一个状态。app

    如上图,绿色区域是ItemView,OutRect包裹着ItemView。经过设置 outRect 中的 top、left、right、bottom 就能够设置相对于ItemView的偏移量。例如,outRect.bottom=1,那么就是相对于 itemView 底部,有1px的距离,显示的效果就是看起来像是分割线,且分割线的颜色就是背景色。ide

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
                               @NonNull RecyclerView parent,
                               @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //第一个的ItemView不须要分割线
        if (parent.getChildAdapterPosition(view) != 0) {
            outRect.top = 5;
            mDividerHeight = 5;
        }
    }
    复制代码
  • onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)ui

    配合 getItemOffsets 使用的,getItemOffsets 撑开了 ItemView 的上下左右间隔区域,而 onDraw 方法经过计算每一个 ItemView 的坐标位置与它的 outRect 值来肯定它要绘制内容的区间。spa

    须要注意的一点是 getItemOffsets 是针对每个 ItemView,而 onDraw 方法倒是针对 RecyclerView 自己,因此在 onDraw 方法中须要遍历屏幕上可见的 ItemView,分别获取它们的位置信息,而后分别的绘制对应的分割线。.net

    @Override
    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent,
                       @NonNull RecyclerView.State state) {
        super.onDraw(c, parent, state);
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view = parent.getChildAt(i);
            int index = parent.getChildAdapterPosition(view);
            //第一个ItemView不须要绘制
            if (index == 0) {
                continue;
            }
            //获得位置
            //view.getTop()获取到的是Y轴坐标,从上往下递增,因此是 view.getTop() - mDividerHeight
            float dividerTop = view.getTop() - mDividerHeight; 
            float dividerLeft = parent.getPaddingLeft();
            float dividerBottom = view.getTop();
            float dividerRight = parent.getWidth() - parent.getPaddingRight();
            //手动绘制
            c.drawRect(dividerLeft, dividerTop, dividerRight, dividerBottom, mPaint);
        }
    }
    复制代码
  • onDrawOver

    onDraw 是绘制在itemView下方,若是想要绘制在itemView上方,能够用 onDrawOver!

相关文章
相关标签/搜索