当前位置: 首页 > news >正文

android recyclerview缓存2_四级缓存机制

RecyclerView 的缓存机制设计得非常精妙,主要分为 四级缓存机制,用来实现「滑动流畅」与「避免重复创建 ViewHolder」。


🧩 一、RecyclerView 的四级缓存机制

RecyclerView 内部的缓存体系主要存在于 Recycler 对象中,它有 4 级缓存层次

缓存级别缓存位置缓存内容命中条件是否需要重新绑定数据
1️⃣ Scrap 缓存mAttachedScrap / mChangedScrap当前屏幕中暂时被移除但仍附着的 ViewHolderposition 相同不需要
2️⃣ Recycler 缓存池mCachedViews刚刚离开屏幕的 ViewHolder(仍与 Adapter 数据对应)position 相同可能需要绑定(如果数据变化)
3️⃣ ViewCacheExtension(可选)自定义缓存逻辑自定义 ViewHolder 缓存策略自定义可自定义是否重新绑定
4️⃣ RecycledViewPool(共享池)RecycledViewPool可复用的 ViewHolder(按 viewType 分类)viewType 相同需要重新绑定

🧠 二、缓存机制的工作流程

假设 RecyclerView 滑动时有一个 item 被移出屏幕,那么流程如下:

🔹 1. 从屏幕上移除

当一个 Item 滑出屏幕:

  • RecyclerView 会先尝试把对应的 ViewHolder 放入 mCachedViews
  • 如果 mCachedViews 已经满(默认容量是 2),则最旧的 ViewHolder 会被移入 RecycledViewPool

🔹 2. 获取可复用的 ViewHolder

当 RecyclerView 需要显示一个新的 item 时,会按以下顺序查找缓存:

1️⃣ mAttachedScrap / mChangedScrap

  • 如果 item 仍在屏幕中(比如执行动画时),会从这里直接取出。

2️⃣ mCachedViews

  • 如果滑动回到刚刚移出屏幕的 item,通常能直接命中,极快。

3️⃣ ViewCacheExtension(如果开发者自定义了)

  • 提供更灵活的缓存机制。

4️⃣ RecycledViewPool

  • 如果前几级都找不到,会从全局池中根据 viewType 获取可复用的 ViewHolder。

5️⃣ 最终创建新 ViewHolder

  • 如果四级缓存都 miss,则调用 Adapter 的 onCreateViewHolder() 重新创建。

🪣 三、各缓存的关系图

Recycler├── mAttachedScrap          // 屏幕中可见或刚移除的ViewHolder├── mCachedViews (size=2)   // 最近离开的item缓存├── ViewCacheExtension      // 开发者自定义缓存扩展└── RecycledViewPool        // 全局池(按viewType存放)

⚙️ 四、RecycledViewPool 的意义

RecycledViewPool 是可 在多个 RecyclerView 之间共享的缓存池
例如 ViewPager+RecyclerView 或多 Tab 列表场景,可以让不同 RecyclerView 共享 ViewHolder,减少重复创建的开销:

val pool = RecycledViewPool()
recyclerView1.setRecycledViewPool(pool)
recyclerView2.setRecycledViewPool(pool)

可以通过以下方法设置每种类型的最大缓存数:

pool.setMaxRecycledViews(VIEW_TYPE_ITEM, 10)

🧮 五、关键源码位置(理解加分)

主要类:

  • RecyclerView.Recycler(负责回收与复用逻辑)
  • RecyclerView.RecycledViewPool(全局缓存池)
  • Adapter.createViewHolder() / bindViewHolder()

核心方法:

  • Recycler.getViewForPosition()
  • Recycler.tryGetViewHolderForPositionByDeadline()

✅ 六、总结对比表

缓存层级存放位置特点命中率是否重新bind
mAttachedScrap当前屏幕内临时存放
mCachedViews最近离屏数量有限(2)有时
ViewCacheExtension可选自定义灵活不定自定义
RecycledViewPool全局共享按类型分池

💡 面试高分总结回答模板:

RecyclerView 采用四级缓存机制来提高复用率与滑动性能,分别是:

  1. Scrap 缓存:缓存当前屏幕中临时移除的 ViewHolder。
  2. Cached 缓存:缓存刚离开屏幕的少量 ViewHolder。
  3. ViewCacheExtension:开发者可自定义缓存逻辑。
  4. RecycledViewPool:按 viewType 分类的全局复用池,可多个 RecyclerView 共享。

当 RecyclerView 需要新的 View 时,会依次从这些缓存中查找可复用的 ViewHolder,若找不到才创建新的。
这套机制极大地提升了性能,避免了频繁创建 View 和调用 onCreateViewHolder() 的开销。


http://www.dtcms.com/a/604880.html

相关文章:

  • [特殊字符] 在 macOS 上设置 SQLite
  • android recyclerview缓存1_概念和常见问题
  • SQLite 速成学习
  • [特殊字符] 在 Windows 上设置 SQLite
  • 做资源网站违法吗深圳大梅沙
  • 【环境数据处理】-基于R批量对环境数据克里金插值提高数据精度
  • 广州wap网站建设百度seo优化技术
  • linux centos常用命令整理
  • Java设计模式之建造者模式(Builder)详解
  • [智能体设计模式] 第6章:规划
  • 学习react第三天
  • 营销软文网站西安网站建设网络公司熊掌号
  • 二分查找算法介绍及使用
  • [element-plus] el-tree 动态增加节点,删除节点
  • SQL:从数据基石到安全前线的双重审视
  • 数据结构:双向链表(1)
  • 【C++】深入拆解二叉搜索树:从递归与非递归双视角,彻底掌握STL容器的基石
  • 深圳趣网站建设网络外包服务公司
  • Axios 全面详解
  • ios-AVIF
  • 360网站建设公司哪家好石家庄有哪些互联网公司
  • 单机并发简介
  • 自相关实操流程
  • java基础-集合接口(Collection)
  • 基于中国深圳无桩共享单车数据的出行目的推断与时空活动模式挖掘
  • 【Rust】通过系统编程语言获取当前系统内存、CPU等运行情况,以及简单实现图片采集并设置系统壁纸
  • 【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 D
  • 智能合同系统,如何为企业合同管理保驾护航?
  • 基于Rust实现爬取 GitHub Trending 热门仓库
  • 深圳市建设局官方网站曼联对利物浦新闻