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

Android RecyclerView 四级缓存详解

RecyclerView 的缓存机制是其高性能的核心,分为四级缓存,按优先级从高到低依次查找可复用的 ViewHolder。


四级缓存总览

级别缓存对象容量作用范围数据是否重置
一级mAttachedScrap/mChangedScrap无固定上限屏幕内
二级mCachedViews默认2刚滑出屏幕
三级mViewCacheExtension自定义开发者控制
四级mRecyclerPool每种 type 默认5缓存池

一级缓存:mAttachedScrap / mChangedScrap(屏幕内缓存)

触发场景

  • 调用notifyDataSetChanged()notifyItemRangeChanged()局部刷新方法时

  • LayoutManager对 Item 进行重新布局

特点

  • 数据无需重新绑定:ViewHolder 的 position、数据都保持不变

  • 直接从mAttachedScrap中取出,不走onBindViewHolder()

  • mChangedScrap用于处理notifyItemChanged()等变化场景

java

// 伪代码示意 if (holder = mAttachedScrap.get(position)) { // 直接复用,无需绑定 return holder; }

二级缓存:mCachedViews(屏幕外缓存)

触发场景

  • Item刚滑出屏幕时,会被放入mCachedViews

  • 用户快速滑回时,能立即复用

特点

  • 默认容量为2(可通过setItemViewCacheSize()调整)

  • 数据保持原样:ViewHolder 的 position 和数据不变

  • 复用时无需调用onBindViewHolder()

  • 超出容量时,按 FIFO 规则移入四级缓存(RecyclerPool)

java

// 设置二级缓存大小 recyclerView.setItemViewCacheSize(5);

适用场景

  • 左右滑动切换的 ViewPager2(内部基于 RecyclerView)

  • 列表快速来回滑动


三级缓存:mViewCacheExtension(自定义缓存)

触发场景

  • 开发者自行实现的缓存策略

  • 系统默认不启用(返回 null)

特点

  • 需要继承RecyclerView.ViewCacheExtension并实现getViewForPositionAndType()

  • 极少使用,除非有极其特殊的缓存需求

java

// 几乎不会用到 RecyclerView.ViewCacheExtension extension = new RecyclerView.ViewCacheExtension() { @Override public View getViewForPositionAndType(Recycler recycler, int position, int viewType) { // 自定义逻辑,通常返回 null return null; } }; recyclerView.setViewCacheExtension(extension);

四级缓存:mRecyclerPool(缓存池)

触发场景

  • mCachedViews满后,新滑出的 Item 会进入 Pool

  • 不同 RecyclerView 之间共享缓存

特点

  • viewType分类存储,每种 type 默认容量为5

  • 数据会被重置:复用时必须调用onBindViewHolder()

  • 可多个 RecyclerView 共享同一个 Pool

java

// 获取/设置缓存池 RecyclerView.RecycledViewPool pool = recyclerView.getRecycledViewPool(); pool.setMaxRecycledViews(TYPE_ITEM, 10); // 设置某类型的最大缓存数 // 多个 RecyclerView 共享缓存池(常见于嵌套 RecyclerView) recyclerView2.setRecycledViewPool(pool);

缓存查找流程图

plain

尝试获取 ViewHolder │ ▼ ┌─────────────────────┐ │ 1. mAttachedScrap │ ──► 命中?直接返回(不绑定数据) │ / mChangedScrap │ └─────────────────────┘ │ 未命中 ▼ ┌─────────────────────┐ │ 2. mCachedViews │ ──► 命中?直接返回(不绑定数据) └─────────────────────┘ │ 未命中 ▼ ┌─────────────────────┐ │ 3. mViewCacheExt │ ──► 命中?直接返回(不绑定数据) └─────────────────────┘ │ 未命中 ▼ ┌─────────────────────┐ │ 4. mRecyclerPool │ ──► 命中?返回,但需调用 onBindViewHolder() └─────────────────────┘ │ 未命中 ▼ 创建新的 ViewHolder(onCreateViewHolder)

实际开发建议

场景建议
列表快速来回滑动调大mCachedViewssetItemViewCacheSize(5)
嵌套 RecyclerView共享RecycledViewPool,避免重复创建
多种 Item 类型通过setMaxRecycledViews()调整各类型的 Pool 大小
超大图/视频 Item适当减小缓存,避免内存占用过高
预加载配合GapWorker(RecyclerView 内部预取机制)

一句话总结

一级保屏幕内、二级保刚滑出、三级自定义、四级兜底复用。
前三级不重新绑定数据,四级必须重新绑定。这就是 RecyclerView 比 ListView 流畅的根本原因。

http://www.cnnetsun.cn/news/4022550.html

相关文章:

  • 联盟链用链成本怎么算?主流计费模式盘点与选型参考
  • 校园后勤数字化改革之路:深度解析学校网站总务建设的痛点与破局
  • 无名杀网页版免费即开即玩:浏览器里体验完整三国杀的全指南
  • 医疗网站建设管理:从底层逻辑到长期运营的系统化思维与实战指南
  • 电视盒子从吃灰到真香:TVBoxOSC 大屏使用从零到一终极指南
  • Windows激活和Office激活一劳永逸:KMS_VL_ALL_AIO 本地KMS工具零基础指南
  • 视觉中国网站建设公司如何打造高转化率落地页提升品牌影响力的深度解析
  • B站视频解析API实战:一套PHP代码,让视频直链5分钟到手
  • NCM音乐转换不再愁:ncmdump免费工具手把手一学就会
  • 从0到1打造高转化页面:电梯网站建设的全流程深度解析与避坑指南
  • 网站建设先进材料如何赋能企业数字化升级并提升行业竞争力
  • 电商实战指南:一份保姆级的电子商务网站建设规划书范文,帮你避坑省钱
  • 网站建设的小故事:新手站长如何从0到1打造高转化官网的蜕变之旅
  • 南充网站建设费用大揭秘:2024普通企业建站到底要花多少钱才不吃亏
  • 从0到1打造高转化私域帝国深度解析专业网站建设微信商城开发的底层逻辑与实战指南
  • Wand-Enhancer 快速上手指南:免费解锁 WeMod 完整功能,手机也能远程操控
  • 昆明网站建设技术研发中心深度解析:如何打造高转化率的数字化营销平台
  • 深入了解灌云县建设局网站:获取最新城建资讯与便民服务指南
  • Adafruit_NeoPixel 1.14.0 更新解读:PY32 新平台入列,你的灯带能跑得更顺
  • 深度解析企业必备的网站系统安全防护体系建设方案 下载与实操指南
  • 像这些问题,我又想能显示在我前面,但是又不是越加越多。因为我要处理的事情会越来越多。那么这些 提词问题会越来越多。我又不想加在本地的 检索,因为本地检索 加一个问题配置起来好麻烦,搞来搞去又影响到之前
  • 零许可费起步企业碳核算:openLCA 开源LCA工具实用指南
  • 南宁百度 网站正在建设中:一家深耕本地市场的数字服务商的致用户公开信与未来展望
  • WebPShop 插件深度解析:Photoshop 里被低估的 WebP 动画与压缩控制
  • 合肥网站建设怎么样
  • 2024年深度解析建设银行网站会员:权益解析、避坑指南与省钱实操手册
  • 合肥建设学校网站:从0到1的实战记录与那些踩过坑换来的真诚建议
  • 程序出问题怎么查,以及如何让它不掉线
  • 实时AI换脸工具实战指南:一张自拍,3分钟点亮你的数字分身
  • 揭秘营销型网站建设团队背后的故事与那些被你忽略的转化细节