Android | 再探 RecyclerView 之名词解析

文章目录

  • Adapter、ViewHolder
  • child view
  • LayoutManager
  • Recycler
  • Scrap
  • Dirty
  • Index
  • Position
    • layout position 和 adapter position
  • 四级缓存


浏览本文前推荐先阅读 Android入门(九)| 滚动控件 ListView 与 RecyclerView

Adapter、ViewHolder

Adapter: A subclass of RecyclerView.Adapter responsible for providing views that represent items in a data set.

  • 翻译:RecyclerView.Adapter 的子类。Adapter (适配器) 负责提供表示 data set(数据集) 中 items(子项) 的 views(视图)。

  • 解析:RecyclerView 只是一个 ViewGroup,它只认识 View ,不清楚构成 前端界面View 的 后端Data数据的具体结构。因此,RecyclerView 需要一个 AdapterData 转换为 RecyclerView 认识的 ViewHolder

  • ViewHolder:view 进行操作,在 ViewHolder 中会将 view 中的各个控件实例化,然后进行管理,如:设置控件的点击事件等。


child view

RecyclerView滚动控件 中的 最小子元素,比如对于布局方式为 LinearLayout(线性布局) 的 RecyclerView 来说,child view(子视图) 就是每一行。

我个人理解为 RecyclerView 是由 data set 的所有数据构建而成的,而每个 child view 都是由某个 data item(数据子项) 构建而成的。


LayoutManager

虽然 Adapter 已经将 data set 转换为了 views,但是以怎样的布局显示这些 views 也是一个问题。因此 RecyclerView 委托 LayoutManager 负责 view 布局的显示管理。有多种布局方式供选择,如:线性布局、网格布局等。

PS:LayoutManager 只负责将 view 呈现在 Recycle 中,并不直接负责对 view 的管理,view 的管理由下面的 Recycler 负责。


Recycler

管理不在前台的 View,对 View 进行缓存,以便后续重用,避免每次都需要加载 view,显著提高性能。LayoutManager 在需要 View 的时候会向 Recycler 进行索取,当 LayoutManager 不需要 View (试图滑出)的时候,就直接将废弃的 View 丢给 Recycler


Scrap

在加载布局期间已进入 临时分离(temporarily detached) 状态的子视图。 Scrap views 可以在不与 parent RecyclerView 完全分离(fully detached) 的情况下重用。 重用时需要做进一步判定是否需要修改 scrap views

  • 如果不需要 rebinding重新绑定 则不需要修改。
  • 如果该 view 被视为 dirty,则由 适配器Adapter 进行修改。

Dirty

在显示之前必须由 适配器 重新绑定rebound子视图child view


Index

调用 ViewGroup.getChildAt() 时使用的参数,已经添加到 RecyclerView 中的 子view 的索引。 与 Position 形成对比,Position 是数据的位置,Index 是视图的位置。


Position

Position: The position of a data item within an Adapter.

  • 适配器中 data item(数据子项) 的位置。

Position 从大的方向可以分为两种情况:

  1. 方法 onBindViewHolder() 中的参数 position
  2. 通过 ViewHoldergetLayoutPosition()/getAdapterPosition() 方法得到的 layout position/adapter position

对于第一种 positon,我们通常使用它来得到子视图,举个例子:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {// 通过 position 获取 DataSet 数据集(如数组等)中对应的子项 DateDate date = DataSet.get(position);
}

对于第二种

layout position 和 adapter position

ListView 不同, RecyclerView 将 跟踪 Adapter 的工作从 RecyclerView.LayoutManager 中抽离,交给 RecyclerView.Adapter 类。ListView 是没有 “ListView.Adapter” 的,ListView 中需要用到适配器的时候,都是自定义一个 BaseAdapter类 的子类,而 RecyclerView 已经为开发者封装好了 RecyclerView.Adapter ,如此一来 RecyclerView 便能够在更新布局期间对 data set(数据集)进行批处理(等待数据修改完成再传递给布局,此等待时间小于 16 毫秒)。这可以将 LayoutManager 从跟踪 Adapter 的工作中解脱出来,而去负责 calculate animations(更新界面)的工作。这有助于提高性能,因为所有 view bindings(视图绑定) 都同时发生,并且避免了不必要的绑定。

不过这种抽象方式导致了在 RecyclerView 中有两种与 位置 相关的方法:

  • layout position: 在最近一次布局更新后 view item 在布局中的位置,这个位置是站在 LayoutManager 的角度得到的 view 的位置,也是布局更新后用户直观看到的布局。通过 getLayoutPosition() 得到。
  • adapter position: ViewHolder item 在适配器中的位置,这是站在 Adapter 的角度得到的 ViewHolder 所在的位置,通常是用户单击某个 ViewHolder item 时,询问 Adapter 得到的。通过 getAdapterPosition() 得到。

当适配器内容改变时,并且调用 adapter.notify*方法 从 RecyclerView 请求一个新的布局。从那一刻起,新布局更新完成(此时间小于 16 毫秒),两个 position 可能不匹配,因为布局还没有反映适配器的变化。除此之外,这两个 position 在大多数时候是相等的。

getAdapterPosition() 使用时的注意事项:

  • 由于调用 notifyDataSetChanged() 会使所有内容无效,因此 RecyclerView 在更新下一个布局之前不知道 ViewHolderadapter position。在这种情况下,getAdapterPosition() 将返回 RecyclerView#NO_POSITION( -1)

  • 但是假设调用了 notifyItemInserted(0) ,先前 adapter position = 0ViewHolder 调用 getAdapterPosition() 将立即返回 adapter position = 1。因此,只要是对 granular (最小粒度,指单元子项)调用 notify events (应该指的是 notifyItem* 方法),那么即使布局尚未更新完成,也能立刻获得 adapter position

  • 如果用户点击时 getAdapterPosition() 返回 NO_POSITION,那么最好忽略那个点击,因为不知道用户点击了什么(除非有一些其他的机制能够确认被点击的是什么,例如用于查找单元子项的稳定ID)。


四级缓存

缓存级别详细描述
一级缓存 mAttachedScrap/mChangedScrap缓存屏幕可见范围的 ViewHolder
二级缓存 mCachedViews按 child View 的 position 或 id 缓存滑动时即将与 RecyclerView 分离的 ViewHolder。
三级缓存 mViewCacheExtension开发者自行实现的缓存。
四级缓存 mRecyclerPoolViewHolder缓存池,本质上是一个 android.util.SparseArray,其中 key 是 ViewType(int类型),value 存放的是 ArrayList< ViewHolder> ,默认每个 ArrayList 中最多存放5个 ViewHolder。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习:第一章-Linux简介

一 UNIX发展史1 1965年&#xff0c;美国麻省理工学院&#xff08;MIT&#xff09;、通用电气公司&#xff08;GE&#xff09;及AT&T的贝尔实验室联合开发Multics工程计划&#xff0c;其目标是开发一种交互式的具有多道程序处理能力的分时操作系统&#xff0c;但因Multics追…

尼尔机器人技能快捷键_《尼尔机械纪元》连招操作技巧

《尼尔机械纪元》中的每个角色都可以装备一个轻武器和一个重武器&#xff0c;技能招式也很丰富&#xff0c;下面为大家带来了《尼尔机械纪元》连招操作技巧&#xff0c;希望对你们有所帮助。连击技能展示视频视频原址&#xff1a;点击进入基本没有什么太难的连段&#xff0c;只…

保姆级教学!Xcode 配置 OpenGL 环境

文章目录GLFW获取 GLFWGLAD获取 GLAD在 Xcode 中配置下载好的 GLFW 和 GLAD配置流程检测是否配置成功无关配置的题外话——Xcode 下安全的删除移动操作GLFW Graphics Library Framework&#xff08;图形库框架&#xff09;&#xff0c;可以让我们通过其封装好的 通用API 来正确…

Android入门(17)| 百度提供的 Android定位SDK

文章目录配置百度提供的 Android定位SDK用于发布的 SHA1用于测试的 SHA1使用百度定位实例配置百度提供的 Android定位SDK 详情参见官方文档&#xff0c;这里仅对获取 SHA1 做详细介绍&#xff1a; 用于发布的 SHA1 用于测试的 SHA1 使用百度定位实例 public class LocationAc…

ios 不被遮挡 阴影_为何你没见到日环食?你不知道的天象常识原来还有这么多 | 返朴...

关注风云之声提升思维层次导读说好的日环食呢&#xff0c;为什么上周很多人只等到了日偏食?日食月食的时间和种类是怎么预测的?你真的弄懂了各种日食和月食的成因吗&#xff1f;你了解它们有什么区别和联系&#xff0c;又遵循什么样的时间规律吗? 日食和月食发生的频率一样吗…

初识贝塞尔(bezier)曲线

文章目录资料援引贝塞尔曲线的用途一阶贝塞尔&#xff08;bezier&#xff09;曲线二阶贝塞尔&#xff08;bezier&#xff09;曲线三阶贝塞尔&#xff08;bezier&#xff09;曲线高阶贝塞尔&#xff08;bezier&#xff09;曲线三阶贝塞尔曲线求插值&#xff08;Slerp&#xff09…

python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码

点击上方“Python编程时光”&#xff0c;选择“加为星标”第一时间关注Python技术干货&#xff01;介绍无论你使用哪种编程语言或框架&#xff0c;测试都非常重要。Hypothesis是 Python 的一个高级测试库。它允许编写测试用例时参数化&#xff0c;然后生成使测试失败的简单易懂…

Mac 下 CMake 的配置与使用

文章目录安装与配置编译单个源文件编译前的准备开始编译编译多个源文件多个源文件在同一目录下多个源文件在不同目录下math 目录下的 CMakeLists.txt根目录的 CMakeLists.txtoption 选项导入外部库本地导入&#xff08;find_package&#xff09;外部导入&#xff08;FetchConte…

五轴编程_沙井万丰数控数控编程五轴编程那个软件好用

沙井万丰数控数控编程五轴编程那个软件好用设计需要掌握很高很全面的知识和技能&#xff0c;模具做的好&#xff0c;产品质量好&#xff0c;模具结构合理&#xff0c;生产效率高&#xff0c;工厂效益好。正因如此&#xff0c;模具技术工在外打工的工资都非常的高。少则每月几千…

Linux学习:第二章-Linux安装

一虚拟机使用 VMware主要特点&#xff1a; 1、不需要分区或重新开机就能在同一台PC上使用两种以上的操作系统 2、本机系统可以与虚拟机系统网络通信 3、可以设定并且随时修改虚拟机操作系统的硬件环境 二安装方式 图形安装&#xff1a;直接回车 字符安装&#xff1a;linux tex…

keil3如何放大字体_国潮海报不会做?送你国风字体+图案笔刷+PSD素材+包装样机...

有很多朋友都问带鱼&#xff0c;国潮风的海报到底应该怎么做呢&#xff1f;首先你要知道什么是国潮风&#xff1a;国潮风就是现代文化和古代文化的碰撞&#xff0c;是年轻人的态度&#xff01;那么应该如何构图如何设计呢&#xff1f;如何配色如何搭配字体呢&#xff1f;这些方…

Google 开源项目风格指南学习笔记——C++篇

文章目录前言0. 缩写名词解释1. 头文件1.1. Self-contained 头文件1.2. 头文件保护1.3. 前置声明1.4 内联函数1.5. #include 的路径及顺序2. 作用域2.1. 命名空间2.2. 非成员函数、静态成员函数和全局函数2.3. 局部变量2.4. 静态和全局变量3. 类3.1. 构造函数的职责3.2. 隐式类…

hiveserver2启动不起来_给爱车配个充电宝,70迈汽车应急启动电源,让你远离搭电小广告...

说到汽车应急启动其实我有切身的痛&#xff0c;在哈尔滨零下35的严冬&#xff0c;晚上带着女神吃完饭&#xff0c;高高兴兴地吃完以后一上车&#xff0c;发现电瓶被冻没电了&#xff0c;天知道当时有多尴尬。马上叫了保险公司过来给搭电&#xff0c;结果在饭店从晚上8点一直等到…

Windows 下 VS 配置 OpenGL 环境

文章目录前言获取 GLFW打开 VS前言 感谢B站同学搬运YouTube上的教学视频。 获取 GLFW 从官网上下载GLFW macOS下64位二进制文件 打开 VS 新建解决方案 OpenGL test&#xff0c;并在解决方案中新建文件夹 Dependencies&#xff1a; 从下载好的 glfw 文件夹中找到最新版链接…

ubuntu 网卡双网口 配置_无线网卡m2 ngff keya keye、minipcie接口改转多口有线网卡实现软路...

小型主板及笔记本中的无线网卡m2ngffkeyakeye接口&#xff08;CNVI除外&#xff09;通过m2ngffkeyae转接pcie1x转接板&#xff0c;或者无线网卡的minipcie接口&#xff0c;通过minipcie转接pcie1x转接板可以改装有线网卡板卡&#xff0c;来实现软路由功能。m2ngffkeyae转接pcie…

OpenGL | 通过绘制一个三角形来入门 OpenGL 图形渲染管线

文章目录前言什么是 OpenGl &#xff1f;回顾openGL 的 Object显存结构工作阶段通过顶点缓冲对象将顶点数据初始化至缓冲中标准化设备坐标顶点缓冲对象 VBOglGenBuffersglBindBufferglBufferData建立了一个顶点和一个片段着色器着色器是什么&#xff1f;为什么需要使用着色器&a…

javascript特效_如何在网页添加鼠标点击特效

经常有同学问我怎么做到的&#xff0c;本论坛属于DZ当然用的是插件啦。偶然在网上找到一个关于wordpress的特效代码&#xff0c;分享给大家。WordPress 添加鼠标点击特效实际上这种教程在网上搜索一下有一大堆&#xff0c;已经是各大博主玩烂的东西了。不过既然给自己的博客加上…

Android |双锁单例模式中使用Context如何避免内存泄露的 Warning 提示

文章目录问题解决方法拓展问题 在Android开发中&#xff0c;经常会将工具类以单例模式的方法实现&#xff0c;而工具类中又总不可避免的用到 Context &#xff0c;例如&#xff1a; public class MySingleton {private static volatile MySingleton instance;private final C…

android nio debug模式正常 release包crash_Flutter包大小治理上的探索与实践

Flutter作为一种全新的响应式、跨平台、高性能的移动开发框架&#xff0c;在性能、稳定性和多端体验一致上都有着较好的表现&#xff0c;自开源以来&#xff0c;已经受到越来越多开发者的喜爱。但是&#xff0c;Flutter的引入往往带来包体积的增大&#xff0c;给很多研发团队带…

Linux学习:第三章-Linux常用命令-1

提示符&#xff1a; [rootlocalhost ~]# [登录用户名主机名 当前所在目录]提示符 ~家目录 /root /home/aa 提示符&#xff1a; #超级用户 $普通用户 一 linux命令的格式1、命令 [选项] [参数]lslist显示目录下内容 ①命令名称&#xff1a;ls 命令英文原意&#xff1a;list 命令…