【RecyclerView】 六、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets )
文章目錄
- 一、RecyclerView.ItemDecoration 簡介
- 1、onDraw() 方法
- 2、onDrawOver () 方法
- 3、getItemOffsets () 方法
- 二、RecyclerView.ItemDecoration 源碼注釋解析
- 三、RecyclerView 相關(guān)資料
一、RecyclerView.ItemDecoration 簡介
RecyclerView.ItemDecoration 是 RecyclerView 的內(nèi)部類 , ItemDecoration 顧名思義就是作為 Item 條目裝飾用的 ;
可以控制 RecyclerView 條目組件的 邊距 , 以及在 item 條目組件 底層繪制背景 , 在 item 條目組件 上層繪制裝飾 ;
RecyclerView.ItemDecoration 使用時 , 可以選擇重寫以下三個方法 :
// 繪制底層背景 public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) // 繪制上層裝飾 public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) // 設(shè)置邊距 public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent, @NonNull State state)1、onDraw() 方法
onDraw方法 : 在提供給 RecyclerView 的畫布上繪制合適的裝飾 , 在該方法中繪制的任何內(nèi)容, 都在 item 布局組件繪制之前繪制, 繪制的內(nèi)容都被 item 布局覆蓋 ;
void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) 參數(shù)說明 :
① @NonNull Canvas c : 繪制背景的畫布 ;
② @NonNull RecyclerView parent : 要添加裝飾的 RecyclerView ;
③ @NonNull State state : RecyclerView 的當(dāng)前狀態(tài) ;
函數(shù)原型如下 :
/*** 在提供給 RecyclerView 的畫布上繪制合適的裝飾.* 在該方法中繪制的任何內(nèi)容, 都在 item 布局組件繪制之前繪制, 繪制的內(nèi)容都被 item 布局覆蓋.* * @param c 繪制的畫布* @param parent 要添加裝飾的 RecyclerView* @param state RecyclerView 的當(dāng)前狀態(tài) */public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) {onDraw(c, parent);}2、onDrawOver () 方法
onDrawOver : 在提供給 RecyclerView 的畫布上繪制合適的裝飾, 在該方法中繪制的任何內(nèi)容, 都在 item 布局組件繪制之后繪制, 繪制的內(nèi)容會覆蓋 item 布局, 顯示在 item 布局上層 ;
void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) 參數(shù)說明 :
① @NonNull Canvas c : 繪制背景的畫布 ;
② @NonNull RecyclerView parent : 要添加裝飾的 RecyclerView ;
③ @NonNull State state : RecyclerView 的當(dāng)前狀態(tài) ;
函數(shù)原型如下 :
/*** 在提供給 RecyclerView 的畫布上繪制合適的裝飾.* 在該方法中繪制的任何內(nèi)容, 都在 item 布局組件繪制之后繪制, 繪制的內(nèi)容會覆蓋 item 布局, * 顯示在 item 布局上層.** @param c 繪制的畫布* @param parent 要添加裝飾的 RecyclerView* @param state RecyclerView 的當(dāng)前狀態(tài) */public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,@NonNull State state) {onDrawOver(c, parent);}3、getItemOffsets () 方法
getItemOffsets 方法 : 設(shè)置當(dāng)前的 item 條目布局組件的邊距 , 效果類似于 padding 或 margin ; 默認(rèn)值四個邊距都是 0 ;
針對特殊位置的特殊設(shè)置 : 如果需要取訪問 Adapter 適配器中的關(guān)聯(lián)數(shù)據(jù) , 調(diào)用 RecyclerView.getChildAdapterPosition(View) , 方法獲取適配器中的該 View 組件位置 ; 然后將特殊位置可以設(shè)置不同的參數(shù) , 即可實現(xiàn) " 針對特殊位置的特殊設(shè)置 " 效果 ;
void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull State state) 參數(shù)說明 :
① @NonNull Rect outRect : 接受輸出的矩形 ;
② @NonNull View view : 要裝飾的子 View ;
③ @NonNull RecyclerView parent : 該 ItemDecoration 正在裝飾的 RecyclerView ;
④ @NonNull State state : RecyclerView 的當(dāng)前狀態(tài) ;
函數(shù)原型如下 :
/*** 檢索任何設(shè)置給 item 布局條目的偏移量.* outRect 的任何變量字段指定了 item 布局組件邊距的像素值, 效果類似于 padding 或 margin.* outRect 默認(rèn)的邊距值都是 0.** <p>* 如果想要針對某些位置的 item 條目組件設(shè)置的 ItemDecoration 不生效 , * 應(yīng)該設(shè)置 outRect 所有的 4 個字段值為 0 ;** <p>* 如果需要取訪問 Adapter 適配器中的關(guān)聯(lián)數(shù)據(jù) , 調(diào)用 RecyclerView.getChildAdapterPosition(View)* 方法獲取適配器中的該 View 組件位置 ;** @param outRect 接受輸出的矩形 .* @param view 要裝飾的子 View .* @param parent 該 ItemDecoration 正在裝飾的 RecyclerView .* @param state RecyclerView 的當(dāng)前狀態(tài) .*/public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent, @NonNull State state) {getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),parent);}二、RecyclerView.ItemDecoration 源碼注釋解析
RecyclerView.ItemDecoration 源碼 : 只添加了中文注釋 ;
public class RecyclerView extends ViewGroup implements ScrollingView,NestedScrollingChild2, NestedScrollingChild3 {/*** RecyclerView.ItemDecoration 允許應(yīng)用在適配器中的 item 條目組件之外, 添加特殊的繪圖和布局. * 可以用于繪制 item 條目間的分割線, 高亮顯示, 分組邊界等等. ** 所有的 ItemDecoration 會按照添加順序繪制, 在 item 條目組件繪制前先執(zhí)行 onDraw 方法 , * 在 item 條目繪制之后執(zhí)行 onDrawOver 方法.*/public abstract static class ItemDecoration {/*** 在提供給 RecyclerView 的畫布上繪制合適的裝飾.* 在該方法中繪制的任何內(nèi)容, 都在 item 布局組件繪制之前繪制, 繪制的內(nèi)容都被 item 布局覆蓋.* * @param c 繪制的畫布* @param parent 要添加裝飾的 RecyclerView* @param state RecyclerView 的當(dāng)前狀態(tài) */public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) {onDraw(c, parent);}/*** @deprecated 被廢棄的方法, 不推薦使用 * Override {@link #onDraw(Canvas, RecyclerView, RecyclerView.State)}*/@Deprecatedpublic void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent) {}/*** 在提供給 RecyclerView 的畫布上繪制合適的裝飾.* 在該方法中繪制的任何內(nèi)容, 都在 item 布局組件繪制之后繪制, 繪制的內(nèi)容會覆蓋 item 布局, * 顯示在 item 布局上層.** @param c 繪制的畫布* @param parent 要添加裝飾的 RecyclerView* @param state RecyclerView 的當(dāng)前狀態(tài) */public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,@NonNull State state) {onDrawOver(c, parent);}/*** @deprecated 被廢棄的方法, 不推薦使用 * Override {@link #onDrawOver(Canvas, RecyclerView, RecyclerView.State)}*/@Deprecatedpublic void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent) {}/*** @deprecated 被廢棄的方法, 不推薦使用 * Use {@link #getItemOffsets(Rect, View, RecyclerView, State)}*/@Deprecatedpublic void getItemOffsets(@NonNull Rect outRect, int itemPosition,@NonNull RecyclerView parent) {outRect.set(0, 0, 0, 0);}/*** 檢索任何設(shè)置給 item 布局條目的偏移量.* outRect 的任何變量字段指定了 item 布局組件邊距的像素值, 效果類似于 padding 或 margin.* outRect 默認(rèn)的邊距值都是 0.** <p>* 如果想要針對某些位置的 item 條目組件設(shè)置的 ItemDecoration 不生效 , * 應(yīng)該設(shè)置 outRect 所有的 4 個字段值為 0 ;** <p>* 如果需要取訪問 Adapter 適配器中的關(guān)聯(lián)數(shù)據(jù) , 調(diào)用 RecyclerView.getChildAdapterPosition(View)* 方法獲取適配器中的該 View 組件位置 ;** @param outRect 接受輸出的矩形 .* @param view 要裝飾的子 View .* @param parent 該 ItemDecoration 正在裝飾的 RecyclerView .* @param state RecyclerView 的當(dāng)前狀態(tài) .*/public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent, @NonNull State state) {getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),parent);}} }三、RecyclerView 相關(guān)資料
官方文檔 :
使用 RecyclerView 創(chuàng)建動態(tài)列表 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview
高級 RecyclerView 自定義 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview-custom
代碼示例 :
GitHub 源碼地址 : https://github.com/han1202012/001_RecyclerView
博客源碼快照 : https://download.csdn.net/download/han1202012/14945904
( 使用 Android Studio 打開 )
總結(jié)
以上是生活随笔為你收集整理的【RecyclerView】 六、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【RecyclerView】 五、Rec
- 下一篇: 【RecyclerView】 七、Rec