RecyclerView.ItemDecoration不僅僅只是用來畫線實現分割線這么簡單;
你可以繪制everything, 只要你想要; 都可以;
最常用的:
繪制分割線;
繪制分組標題;點這里查看效果圖
參考文檔:
http://blog.csdn.net/pengkv/article/details/50538121
ItemDecoration有3個重要的方法:
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
}
但其實:
//onDrawOver方法實現的效果和onDraw是一樣的,這樣的話,就只剩下2個方法了;
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
}
為了更好的查看效果,你只要實現這一個方法就夠了:
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
//你只需要使用自定義View的套路, 這里繪制效果就行;
}
getItemOffsets方法說明
getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
這個方法的作用很簡單, 也很好理解
就是用來設置view的騰出空間
第一個參數: outRect 用來返回數據
outRect.set(l, t, r, b);
表示view的左邊騰出l距離, view的上邊騰出t距離, view的右邊騰出r距離, view的下邊騰出b距離.
你可以只設置其中一個, 也可以設置全部的4個, 也可以一個都不設置; 這個取決于你.
這里騰出的距離, 會在onDraw方法中體現出來; 如果騰出的距離不夠, 那么分割線就會覆蓋Item繪制.
有了距離之后, 就是可以在onDraw中繪制分割線了;
onDraw方法說明
onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
這個方法有一點需要說明, 你需要繪制所有可見view的分割線, 而不是只繪制一個view的分割線;
所以你至少需要遍歷當前RecyclerView中,所有可見的view
//你可能就需要像我一樣, 遍歷一遍了;
final LinearLayoutManager layoutManager = (LinearLayoutManager) manager;
final int firstItem = layoutManager.findFirstVisibleItemPosition();
for (int i = 0; i < layoutManager.getChildCount(); i++) {
final View view = layoutManager.findViewByPosition(firstItem + i);
if (view != null) {
if (layoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL) {
//水平
drawDrawableV(c, view);
} else {
//垂直
drawDrawableH(c, view);
}
}
}
onDrawOver方法說明
onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)
此方法, 和onDraw效果是一樣的, 唯一的不同就是, onDrawOver方法會在onDraw方法繪制之后執行;
這個方法通常用來繪制需要懸停的分割線, 比如 分組的組名,等;
這里有一份我寫的分割線源碼:GitHub傳送門
支持GridLayoutManager和LinearLayoutManager,暫不支持StaggeredGridLayoutManager,
沒時間寫.而且本人用的也不多, 所以...如果有需要,可以聯系我, 我再添加.
使用方法:
recyclerView.addItemDecoration(new RBaseItemDecoration());//不帶參數的構造方法, 全部采用默認值
public RBaseItemDecoration() {
this(1);
}
//創建一個指定高度的分割線
public RBaseItemDecoration(int dividerSize) {
this(dividerSize, dividerColor);
}
//創建一個自定義的分割線
public RBaseItemDecoration(Drawable drawable) {
this(drawable, 1);
}
//創建自定義大小和顏色的分割線
public RBaseItemDecoration(int dividerSize, int dividerColor) {
mDividerSize = dividerSize;
mDividerDrawableV = new ColorDrawable(dividerColor);
mDividerDrawableH = mDividerDrawableV;
}
//創建一個自定義的分割線,并指定大小
public RBaseItemDecoration(Drawable drawable, int dividerSize) {
mDividerSize = dividerSize;
mDividerDrawableV = drawable;
mDividerDrawableH = drawable;
}
更高級的用法:
//GridLayoutManager可以分別設置垂直方向的Drawable和水平方向的Drawable
//設置垂直方向的Drawable
public void setDividerDrawableV(Drawable dividerDrawableV) {
mDividerDrawableV = dividerDrawableV;
}
//設置水平方向的Drawable
public void setDividerDrawableH(Drawable dividerDrawableH) {
mDividerDrawableH = dividerDrawableH;
}
//設置分割線的Margin,影響開始的位置
public void setMarginStart(int marginStart) {
mMarginStart = marginStart;
}
//設置分割線的Margin,影響結束的位置
public void setMarginEnd(int marginEnd) {
mMarginEnd = marginEnd;
}
至此: 文章就結束了,如有疑問: QQ群 Android:274306954 Swift:399799363 歡迎您的加入.