您好,登錄后才能下訂單哦!
【吐槽】RecyclerView沒有提供分割線的方法,想要加個線還要自己畫,點擊事件的監聽都要自己實現,不過真的好用。
給RecyclerView添加分割線的步驟
1、新建類繼承于RecyclerView.ItemDecoration,此為是抽象類:
public static abstract class ItemDecoration { public void onDraw(Canvas c, RecyclerView parent, State state) { onDraw(c, parent); } public void onDrawOver(Canvas c, RecyclerView parent, State state) { onDrawOver(c, parent); } public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) { getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(), parent); } }
“onDraw和onDrawOver,顯然,這兩個方法是用于繪制的,那么繪制分割線的邏輯可以放在這里面,它們二者的具體區別是:onDraw是在item view繪制之前調用,而onDrawOver是在item view繪制之后調用,因此我們一般選擇重寫其中一個方法即可。getItemOffsets,這個方法是告訴RecyclerView在繪制完一個item view的時候,應該留下多少空位,以便于繪制分割線。”
好像邏輯也不難,但是真的好麻煩,比如我要給我的瀑布流布局加一條系統自帶的分割線,系統自帶的就行,那我要新建一個實現類:
public class DividerItemDecoration extends RecyclerView.ItemDecoration { //使用系統自帶的listDivider private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; private Drawable mDivider; public DividerItemDecoration(Context context) { super(); // 從TypedArray中得到一個Drawable對象 final TypedArray typedArray = context.obtainStyledAttributes(ATTRS); mDivider = typedArray.getDrawable(0); typedArray.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); drawDivider(c, parent); } /** * 遍歷childView,為每一個childView描繪divider * @param c 畫布對象 * @param parent 父控件即RecyclerView */ private void drawDivider(Canvas c, RecyclerView parent) { //獲取分割線的上邊距,即RecyclerView的padding值 final int top = parent.getPaddingTop(); //分割線下邊距 final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); //遍歷所有item view,為它們的右邊方繪制分割線,就是計算出上下左右四個值畫一個矩形 for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); //畫右邊的divider mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //畫完右邊畫底邊 mDivider.setBounds(child.getLeft() + child.getPaddingLeft(), child.getBottom() + params.bottomMargin, child.getRight() - child.getPaddingRight(), child.getBottom() + mDivider.getIntrinsicHeight()); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); outRect.set(0, 0, mDivider.getIntrinsicHeight(), mDivider.getIntrinsicHeight()); } }
2、為RecyclerView添加寫好的ItemDecoration即可
mRecyclerView.addItemDecoration(new DividerItemDecoration(this));
3、沒有3。
其實從 RecyclerView.ItemDecoration 的名字就看得出來,它是RecyclerView的item的裝飾品,也就是說,除了畫分割線,想畫什么都是可以的。
以上這篇Android 給RecyclerView添加分割線的具體步驟(分享)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。