android RecycledViewPool的作用详解
一、先明确基础概念 在深入性能问题之前,有几个核心概念需要先捋清楚。 RecycledViewPool 是什么? 简单说,它就是 RecyclerView 里的一个“缓存池”,专门用来存放那些暂时用不到、但后续可能复用的 ViewHolder。当某个 ViewHolder 从屏幕滑出去,而且连 mC
一、先明确基础概念
在深入性能问题之前,有几个核心概念需要先捋清楚。
-
RecycledViewPool是什么?
简单说,它就是RecyclerView里的一个“缓存池”,专门用来存放那些暂时用不到、但后续可能复用的ViewHolder。当某个ViewHolder从屏幕滑出去,而且连mCachedViews(另一级缓存)都装不下它的时候,它就会被扔到这个池子里“待命”。 -
RecycledViewPool的默认容量是多少?
容量是按viewType来划分的——默认情况下,每一种viewType最多缓存 5 个ViewHolder。举个例子,如果列表里有两种viewType(比如类型 0 和类型 1),那缓存池就会分别为它们各自预留最多 5 个位置,总共能存 10 个,但两种类型互不干扰。 -
viewType又是什么?
它是RecyclerView区分不同 Item 布局的标识,由getItemViewType()方法返回。不同viewType的ViewHolder不能混用——因为布局不一样嘛。比如文本 Item(viewType=0)和图片 Item(viewType=1)的ViewHolder显然是没法互相复用的。
二、为什么会“频繁创建ViewHolder”?
问题出在缓存池不够用。说白了,就是 RecycledViewPool 里对应某个 viewType 的缓存位置被占满了,导致每次要显示新 Item 时,都得重新创建 ViewHolder(也就是调用 onCreateViewHolder)。

举个例子你就明白了:
假设你的列表里有一个高频出现的 viewType=0(比如 100 个 Item 全是这个类型),而缓存池为这个类型默认只留了 5 个位置。当快速滑动列表时,屏幕外面会产生大量的 viewType=0 的 ViewHolder,但缓存池只能存 5 个。超过 5 个之后,新滑出去的 ViewHolder 就只能被销毁——因为池子满了。等你往回滑的时候,需要重新显示这些 Item,可缓存池里已经没有可复用的了,于是只能再次创建新的 ViewHolder。onCreateViewHolder 被频繁调用,卡顿自然就来了。
三、viewType和缓存池容量的关系
前面说了,RecycledViewPool 的容量是按 viewType 独立分配的,不同 viewType 的缓存互不相干。这意味着什么呢?
- 如果某个
viewType的 Item 特别多(高频出现),而缓存池为它分配的默认容量(5 个)根本不够用,那就会频繁创建新ViewHolder。 - 反过来,如果某个
viewType的 Item 很少(低频出现),就算缓存池容量是 5 个,也未必能填满——不会造成浪费。
还是用数字说话:
- 列表有两种
viewType:viewType=0(占 90% 的 Item)和viewType=1(仅 10%)。 - 默认情况下,两者各有 5 个缓存位。但
viewType=0的 Item 太多,5 个缓存根本招架不住,频繁创建;而viewType=1的 5 个缓存位可能一直闲着。
四、为什么“调整RecycledViewPool容量”能解决问题?
当你为高频出现的 viewType 增大缓存容量——比如从默认的 5 个调到 10 个——效果就很直观了:
- 更多滑出屏幕的
ViewHolder能被留在缓存池里,而不是被销毁。 - 当再次需要显示该类型的 Item 时,能从池子里直接取出
ViewHolder复用,不用重新创建(onCreateViewHolder的调用自然就减少了)。
代码实现很简单:
// 为高频出现的 viewType=0 扩容到 10 个缓存 recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);
这样一来,viewType=0 的缓存容量从 5 变成 10,能容纳更多暂时不用的 ViewHolder,创建新实例的频率也就大幅降低了。
总结
- 频繁创建
ViewHolder的根源:高频出现的viewType对应的缓存池容量不足(默认 5 个),导致滑出的ViewHolder被销毁,再次需要时只能重新创建。 RecycledViewPool默认容量:每种viewType最多缓存 5 个ViewHolder。- 与
viewType的关系:缓存池按viewType隔离,不同类型的ViewHolder不能复用,因此高频类型需要更大的缓存容量。
通过为高频 viewType 增大缓存池容量,能有效提升复用率,减少 ViewHolder 创建次数,从而优化列表滑动性能。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















