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!