一、先明确基础概念
recycledviewpool是什么?- 它是
recyclerview的“缓存池”,专门存储那些“暂时用不到但可能后续复用”的viewholder。当viewholder从屏幕滑出,且超过mcachedviews(另一级缓存)的容量时,会被转移到这里“待命”。
- 它是
recycledviewpool的默认容量是多少?- 它的容量是按
viewtype划分的:默认情况下,每种viewtype最多缓存 5 个viewholder。 - 例如:如果列表有 2 种
viewtype(类型 0 和类型 1),那么缓存池会为类型 0 最多存 5 个,类型 1 最多存 5 个,总容量是 10 个(但按类型隔离)。
- 它的容量是按
viewtype是什么?viewtype是recyclerview用来区分不同 item 布局的标识(由getitemviewtype()方法返回)。不同viewtype的viewholder不能互相复用(因为布局不同)。例如:文本 item(viewtype=0)和图片 item(viewtype=1)的viewholder无法混用。
二、为什么会“频繁创建viewholder”?
核心原因是:recycledviewpool 中对应 viewtype 的缓存不够用了,导致每次需要显示新 item 时,都得重新创建 viewholder(调用 oncreateviewholder)。
举个例子:
假设你的列表有一个高频出现的 viewtype=0(比如 100 个 item 都是这个类型),而 recycledviewpool 为 viewtype=0 的默认容量是 5 个。
- 当快速滑动列表时,屏幕外会产生大量
viewtype=0的viewholder,但缓存池最多只能存 5 个。 - 超过 5 个后,新滑出的
viewholder会被直接销毁(因为缓存池满了)。 - 当你往回滑时,需要重新显示这些
viewtype=0的 item,但缓存池里已经没有可用的了,只能重新创建viewholder,导致oncreateviewholder频繁调用,引发卡顿。
三、viewtype和缓存池容量的关系
recycledviewpool 的容量是按 viewtype 独立分配的,不同 viewtype 的缓存互不干扰。这意味着:
- 如果某个
viewtype的 item 数量特别多(高频出现),但缓存池为它分配的默认容量(5 个)不够用,就会频繁创建新viewholder。 - 反之,如果某个
viewtype的 item 很少(低频出现),即使缓存池容量是 5 个,也可能用不完(不会浪费)。
例如:
- 列表有两种
viewtype:viewtype=0(90% 的 item 都是它)和viewtype=1(仅 10% 的 item)。 - 默认情况下,两者各有 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 的 viewholder 缓存容量从 5 变成 10,能容纳更多暂时不用的 viewholder,大幅降低创建新实例的频率。
总结
- 频繁创建
viewholder的原因:高频出现的viewtype对应的缓存池容量不足(默认 5 个),导致滑出屏幕的viewholder被销毁,再次需要时只能重新创建。 recycledviewpool默认容量:每种viewtype最多缓存 5 个viewholder。- 与
viewtype的关系:缓存池按viewtype隔离,不同类型的viewholder不能复用,因此高频类型需要更大的缓存容量。
通过为高频 viewtype 增大缓存池容量,能提升复用率,减少 viewholder 创建次数,优化列表滑动性能。
到此这篇关于android recycledviewpool的作用的文章就介绍到这了,更多相关android recycledviewpool内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论