日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【RecyclerView】 六、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets )

發(fā)布時間:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【RecyclerView】 六、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。