【Code-Snippet】RecyclerView

1. 經常使用設置

  • 滾動條設置:android:scrollbars="none"
  • 波浪設置:android:overScrollMode="never"

2. 基本寫法

參考java

  • 基本寫法
  • 多種不一樣的item
  • 設置點擊事件

ItemDecoration

  1. 小甜點,RecyclerView 之 ItemDecoration 講解及高級特性實踐android

  2. RecyclerView探索之經過ItemDecoration實現StickyHeader效果git

繼承: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!

相關文章
相關標籤/搜索