news 2026/8/14 12:57:43

Android RecyclerView 四级缓存详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 流畅的根本原因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 12:56:56

联盟链用链成本怎么算?主流计费模式盘点与选型参考

导语 企业上链时最常被问到的三个问题:用链到底要花多少钱?账单会不会随业务量失控?开源免费的链是不是真的省钱?现实中,联盟链的计费模式远没有"免费或按量"这么简单——按量计费、预付费套餐、封顶订阅、开…

作者头像 李华
网站建设 2026/8/14 12:56:45

校园后勤数字化改革之路:深度解析学校网站总务建设的痛点与破局

在这个万物互联、数据驱动的时代,当我们谈论“智慧校园”时,绝大多数人的第一反应往往是多媒体教室的交互大屏、图书馆的自助借还系统,或者是教学楼里那套复杂的安保监控网络。大家往往忽略了一个看似不起眼,却直接影响师生每日体验、决定学校运行效率甚至关乎教育公平的基…

作者头像 李华
网站建设 2026/8/14 12:56:29

无名杀网页版免费即开即玩:浏览器里体验完整三国杀的全指南

无名杀网页版免费即开即玩:浏览器里体验完整三国杀的全指南 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 晚高峰的地铁上,你掏出手机想开一局三国杀,结果不是没装客户端,就是更新卡…

作者头像 李华
网站建设 2026/8/14 12:55:57

医疗网站建设管理:从底层逻辑到长期运营的系统化思维与实战指南

在这个互联网普及率极高的时代,去医院挂号、查询检查结果、了解科室介绍,甚至只是简单的在线咨询,往往第一件事就是掏出手机搜一下。对于医疗机构来说,官网不再仅仅是一个“电子名片”,而是患者了解医院的第一窗口,是建立信任感的关键枢纽,更是连接医患关系的核心桥梁。…

作者头像 李华
网站建设 2026/8/14 12:55:56

电视盒子从吃灰到真香:TVBoxOSC 大屏使用从零到一终极指南

电视盒子从吃灰到真香:TVBoxOSC 大屏使用从零到一终极指南 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库,用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC 家里的电视盒子是不是也这…

作者头像 李华