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 规则移入四级缓存RecyclerPooljava// 设置二级缓存大小 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 共享同一个 Pooljava// 获取/设置缓存池 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() └─────────────────────┘ │ 未命中 ▼ 创建新的 ViewHolderonCreateViewHolder实际开发建议场景建议列表快速来回滑动调大mCachedViewssetItemViewCacheSize(5)嵌套 RecyclerView共享RecycledViewPool避免重复创建多种 Item 类型通过setMaxRecycledViews()调整各类型的 Pool 大小超大图/视频 Item适当减小缓存避免内存占用过高预加载配合GapWorkerRecyclerView 内部预取机制一句话总结一级保屏幕内、二级保刚滑出、三级自定义、四级兜底复用。前三级不重新绑定数据四级必须重新绑定。这就是 RecyclerView 比 ListView 流畅的根本原因。