分割線我們利用RecyclerView的addItemDecoration(ItemDecoration fromHtml) 新建一個類來看看到底是什麼: 有兩個方法getItemOffsets()這裡我一般指定偏移量就可以了,就是分割線占多少高度,或者說是畫在什麼位置,你總的給我留出位置來;onD ...
分割線我們利用RecyclerView的addItemDecoration(ItemDecoration fromHtml) 新建一個類來看看到底是什麼:
public class CategoryItemDecoration extends RecyclerView.ItemDecoration { @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { } }
有兩個方法getItemOffsets()這裡我一般指定偏移量就可以了,就是分割線占多少高度,或者說是畫在什麼位置,你總的給我留出位置來;onDraw()我們可以直接去繪製,繪製什麼都可以因為有Canvas ,但一般都是繪製Drawable。
public class CategoryItemDecoration extends RecyclerView.ItemDecoration { private Paint mPaint; public CategoryItemDecoration(int color) { // 直接繪製顏色 只是用來測試 mPaint = new Paint(); mPaint.setColor(color); mPaint.setAntiAlias(true); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int childCount = parent.getChildCount(); // 獲取需要繪製的區域 Rect rect = new Rect(); rect.left = parent.getPaddingLeft(); rect.right = parent.getWidth() - parent.getPaddingRight(); for (int i = 0; i < childCount; i++) { View childView = parent.getChildAt(i); rect.top = childView.getBottom(); rect.bottom = rect.top + 20; // 直接利用Canvas去繪製一個矩形 在留出來的地方 c.drawRect(rect, mPaint); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { // 在每個子View的下麵留出20px來畫分割線 outRect.bottom += 20; } }
2.RecyclerView源碼解析 - 分割線
猜想: 既然考慮了分割線,那麼子View在測量時候肯定要去考慮分割線留出的位置 直接measureChild()方法
猜想: 分割線會調用繪製的方法 onDraw()