android:scrollbars="none"
android:overScrollMode="never"
【参考】java
继承: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!