文章目录

  • 一、RecyclerView.ItemDecoration 简介
    • 1、onDraw() 方法
    • 2、onDrawOver () 方法
    • 3、getItemOffsets () 方法
  • 二、RecyclerView.ItemDecoration 源码注释解析
  • 三、RecyclerView 相关资料

一、RecyclerView.ItemDecoration 简介


RecyclerView.ItemDecoration 是 RecyclerView 的内部类 , 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)
// 设置边距
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent, @NonNull State state)

1、onDraw() 方法

onDraw方法 : 在提供给 RecyclerView 的画布上绘制合适的装饰 , 在该方法中绘制的任何内容, 都在 item 布局组件绘制之前绘制, 绘制的内容都被 item 布局覆盖 ;

void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) 参数说明 :

① @NonNull Canvas c : 绘制背景的画布 ;

② @NonNull RecyclerView parent : 要添加装饰的 RecyclerView ;

③ @NonNull State state : RecyclerView 的当前状态 ;

函数原型如下 :

        /*** 在提供给 RecyclerView 的画布上绘制合适的装饰.* 在该方法中绘制的任何内容, 都在 item 布局组件绘制之前绘制, 绘制的内容都被 item 布局覆盖.* * @param c 绘制的画布* @param parent 要添加装饰的 RecyclerView* @param state RecyclerView 的当前状态 */public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) {onDraw(c, parent);}

2、onDrawOver () 方法

onDrawOver : 在提供给 RecyclerView 的画布上绘制合适的装饰, 在该方法中绘制的任何内容, 都在 item 布局组件绘制之后绘制, 绘制的内容会覆盖 item 布局, 显示在 item 布局上层 ;

void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) 参数说明 :

① @NonNull Canvas c : 绘制背景的画布 ;

② @NonNull RecyclerView parent : 要添加装饰的 RecyclerView ;

③ @NonNull State state : RecyclerView 的当前状态 ;

函数原型如下 :

        /*** 在提供给 RecyclerView 的画布上绘制合适的装饰.* 在该方法中绘制的任何内容, 都在 item 布局组件绘制之后绘制, 绘制的内容会覆盖 item 布局, * 显示在 item 布局上层.** @param c 绘制的画布* @param parent 要添加装饰的 RecyclerView* @param state RecyclerView 的当前状态 */public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,@NonNull State state) {onDrawOver(c, parent);}

3、getItemOffsets () 方法

getItemOffsets 方法 : 设置当前的 item 条目布局组件的边距 , 效果类似于 padding 或 margin ; 默认值四个边距都是 0 ;

针对特殊位置的特殊设置 : 如果需要取访问 Adapter 适配器中的关联数据 , 调用 RecyclerView.getChildAdapterPosition(View) , 方法获取适配器中的该 View 组件位置 ; 然后将特殊位置可以设置不同的参数 , 即可实现 " 针对特殊位置的特殊设置 " 效果 ;

void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull State state) 参数说明 :

① @NonNull Rect outRect : 接受输出的矩形 ;

② @NonNull View view : 要装饰的子 View ;

③ @NonNull RecyclerView parent : 该 ItemDecoration 正在装饰的 RecyclerView ;

④ @NonNull State state : RecyclerView 的当前状态 ;

函数原型如下 :

        /*** 检索任何设置给 item 布局条目的偏移量.* outRect 的任何变量字段指定了 item 布局组件边距的像素值, 效果类似于 padding 或 margin.* outRect 默认的边距值都是 0.** <p>* 如果想要针对某些位置的 item 条目组件设置的 ItemDecoration 不生效 , * 应该设置 outRect 所有的 4 个字段值为 0 ;** <p>* 如果需要取访问 Adapter 适配器中的关联数据 , 调用 RecyclerView.getChildAdapterPosition(View)* 方法获取适配器中的该 View 组件位置 ;** @param outRect 接受输出的矩形 .* @param view    要装饰的子 View .* @param parent  该 ItemDecoration 正在装饰的 RecyclerView .* @param state   RecyclerView 的当前状态 .*/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 允许应用在适配器中的 item 条目组件之外, 添加特殊的绘图和布局. * 可以用于绘制 item 条目间的分割线, 高亮显示, 分组边界等等. ** 所有的 ItemDecoration 会按照添加顺序绘制, 在 item 条目组件绘制前先执行 onDraw 方法 , * 在 item 条目绘制之后执行 onDrawOver 方法.*/public abstract static class ItemDecoration {/*** 在提供给 RecyclerView 的画布上绘制合适的装饰.* 在该方法中绘制的任何内容, 都在 item 布局组件绘制之前绘制, 绘制的内容都被 item 布局覆盖.* * @param c 绘制的画布* @param parent 要添加装饰的 RecyclerView* @param state RecyclerView 的当前状态 */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 的画布上绘制合适的装饰.* 在该方法中绘制的任何内容, 都在 item 布局组件绘制之后绘制, 绘制的内容会覆盖 item 布局, * 显示在 item 布局上层.** @param c 绘制的画布* @param parent 要添加装饰的 RecyclerView* @param state RecyclerView 的当前状态 */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);}/*** 检索任何设置给 item 布局条目的偏移量.* outRect 的任何变量字段指定了 item 布局组件边距的像素值, 效果类似于 padding 或 margin.* outRect 默认的边距值都是 0.** <p>* 如果想要针对某些位置的 item 条目组件设置的 ItemDecoration 不生效 , * 应该设置 outRect 所有的 4 个字段值为 0 ;** <p>* 如果需要取访问 Adapter 适配器中的关联数据 , 调用 RecyclerView.getChildAdapterPosition(View)* 方法获取适配器中的该 View 组件位置 ;** @param outRect 接受输出的矩形 .* @param view    要装饰的子 View .* @param parent  该 ItemDecoration 正在装饰的 RecyclerView .* @param state   RecyclerView 的当前状态 .*/public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,@NonNull RecyclerView parent, @NonNull State state) {getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),parent);}}
}

三、RecyclerView 相关资料


官方文档 :

使用 RecyclerView 创建动态列表 : 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 打开 )

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

  1. 【RecyclerView】 七、RecyclerView.ItemDecoration 条目装饰 ( getItemOffsets 边距设置 )

    文章目录 一.RecyclerView.ItemDecoration 方法说明 三.getItemOffsets 设置要点 四.完整代码示例 五.RecyclerView 相关资料 一.Recycle ...

  2. 【RecyclerView】 八、RecyclerView.ItemDecoration 条目装饰 ( onDraw 和 onDrawOver 绘制要点 )

    文章目录 一.onDraw 和 onDrawOver 绘制要点 二.onDraw 方法示例 三.onDrawOver 方法示例 四.完整代码示例 五.RecyclerView 相关资料 一.onDra ...

  3. 解决安卓刷新recyclerView时导致itemDecoration分栏标题绘制错乱(重叠和隔空现象)

    安卓的 itemDecoration 装饰器是个好东西,可以与adapter适配器一样闪耀.但是刷新的时候有可能发生重叠绘制或者莫名隔空的BUG. 三.原作 本文分栏标题装饰器的原作者为简书博主end ...

  4. 【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )

    文章目录 一.RecyclerView 简介 二.RecyclerView 特点 三.RecyclerView 涉及到的类 四.RecyclerView 相关资料 一.RecyclerView 简介 ...

  5. RecyclerView之利用ItemDecoration实现万能分割线

    上一篇文章讲了如何使用ItemDecoration去实现RecyclerView的万能间距,可是很多时候我们的需求里还会有分割线,有时候既要有合适的间距,也要有分割线,这种需求多出现在列表中,也就是网 ...

  6. recyclerview滚动到指定条目

    android recyclerview滚动到指定条目 自从android5.0推出RecyclerView以后,RecyclerView越来越受广大程序员的热爱了!大家都知道RecyclerView ...

  7. android view嵌套,Android RecyclerView嵌套RecyclerView点击事件

    RecyclerView嵌套RecyclerView点击事件遇到取值错乱的问题 其实问题根本就是咱们没有处理好被嵌套的那层recycleview的position 那么解决思路也很简单,想办法把被嵌套 ...

  8. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

  9. android item三种,Android RecyclerView中的ItemDecoration的几种绘制方法

    如题,我们使用recyclerview的时候,如果没有设置显示条目的margin,或者padding的话,是没有分割线效果的. 那么除去使用margin或padding,其余的方法是用itemdeco ...

最新文章

  1. python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)
  2. python 鼠标键盘操作 pyautogui
  3. Jquery 点击当前的标签对象获取值 与JS整理
  4. SAP BRF+ Interpretation Mode与Generation Mode
  5. Android thumbnail 图片的获得及与原始图片的映射
  6. Apache 基金会宣布 Apache Kylin 成为顶级项目
  7. LeetCode_88、合并两个数组(python)
  8. bt种子制作php,BT种子制作
  9. 洛谷P1792 [国家集训队]种树 题解
  10. 第4讲 组合逻辑电路实例:编码器、译码器、数据选择器、加法器、数值比较器、代码转换器——计算机逻辑基础
  11. Yara、Snort和Sigma规则
  12. WTL自绘界面库(QsImageMgrCtrlBase)
  13. 树洞程序php,Anonymous v20200926 – 秘密 PHP树洞程序
  14. Python基础语法(五)—常用模块和模块的安装和导入
  15. 基于RFID技术的智能门禁系统设计(控制部分)
  16. MySQL之创建函数,一次性插入表中多行数据
  17. java sleep的意义_java 线程Thread.Sleep详解 Thread.Sleep(0)的作用
  18. 今天看到了三年前杭电的LCY老师写的一篇自我检讨,值得大家来读一读
  19. c语言求n个数中最大值和最小值,C语言:从键盘输入n个数,求最大值和最小值(用数组)...
  20. c语言野指针导致问题,C语言进阶之路(三)----野指针的产生原因及解决办法

热门文章

  1. js实现反恐精英+曲线图+饼状图
  2. EXP、IMP 命令详解
  3. legend3---Homestead中Laravel项目502 Bad Gateway
  4. bzoj 3875: [Ahoi2014Jsoi2014]骑士游戏【dp+spfa】
  5. EOS开发基础之五:使用cleos命令行客户端操作EOS——智能合约之Exchange
  6. Python打包工具setuptools的使用
  7. [原创] 为什么模除的时候一般建议选择素数来除?比如说hashtable的桶数会取一个素数...
  8. mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置
  9. WebService安全 身份验证与访问控制
  10. [转载] 中文核心期刊目录(2008)