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

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

文章目录

一、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)}
         */
        @Deprecated
        public 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)}
         */
        @Deprecated
        public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent) {
        }
        /**
         * @deprecated 被废弃的方法, 不推荐使用 
         * Use {@link #getItemOffsets(Rect, View, RecyclerView, State)}
         */
        @Deprecated
        public 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 打开 )


目录
相关文章
|
JSON 小程序 JavaScript
【微信小程序】-- 自定义组件 -- 创建与引用 &样式(三十二)
【微信小程序】-- 自定义组件 -- 创建与引用 &样式(三十二)
|
Linux Perl
Linux命令教程:使用cat命令查看和处理文件
Linux命令教程:使用cat命令查看和处理文件
1390 0
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
企业级API集成方案:基于阿里云函数计算调用DeepSeek全解析
DeepSeek R1 是一款先进的大规模深度学习模型,专为自然语言处理等复杂任务设计。它具备高效的架构、强大的泛化能力和优化的参数管理,适用于文本生成、智能问答、代码生成和数据分析等领域。阿里云平台提供了高性能计算资源、合规与数据安全、低延迟覆盖和成本效益等优势,支持用户便捷部署和调用 DeepSeek R1 模型,确保快速响应和稳定服务。通过阿里云百炼模型服务,用户可以轻松体验满血版 DeepSeek R1,并享受免费试用和灵活的API调用方式。
644 12
|
7月前
|
文字识别 算法 API
飞桨x昇腾生态适配方案:04_模型精度对齐
本文详细介绍了模型在不同硬件(如GPU与NPU)间迁移时的精度对齐方法,包括前向和反向对齐的具体步骤。前向对齐通过模块化对比计算结果(如平均值、最大最小值等),确保误差在合理范围内;反向对齐则聚焦于梯度差异,利用二分法定位问题算子。同时,文章结合PPHGNet_small和MultiHead等具体模块代码,说明了如何打印输出并分析中间结果。此外,还探讨了私有格式、梯度异常及特殊shape等可能影响精度的因素,并提出相应解决策略。整体流程清晰,为跨硬件模型迁移提供了实用指导。
328 10
|
jenkins Java 持续交付
jenkins主从模式配置
jenkins主从模式配置
357 0
jenkins主从模式配置
|
存储 安全 Java
Java.security包中的KeyStore类详解
Java.security包中的KeyStore类详解
930 0
|
存储 SQL 编解码
阿里 移动端(Android)编码规范
为指导 Android 开发者更加高效、高质量地进行 App 开发,呈现给用户体验好、性能优、稳定性佳、安全性高的产品。 本手册以开发者为中心视角分为Java语言规范,Android 资源文件命名与使用,Android 基本组件,UI 与布局,进程、线程与消息通信,文件与数据库,Bitmap、Drawable 与动画,安全,其他等九大部分,根据约束力强弱,规约依次分为强制、推荐、参考三大类:
2068 0
|
Linux 网络安全 数据安全/隐私保护
使用Buildroot为I.MX6制作根文件系统(下)
使用Buildroot为I.MX6制作根文件系统
|
存储 Java 编译器
【高并发内存池】第一篇:定长内存池设计
内存池是池化技术的一种应用。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。
|
测试技术 程序员 Linux
手把手教你用Git——详解git merge
手把手教你用Git——详解git merge
11621 0

热门文章

最新文章