RecyclerView.setItemViewCacheSize和RecycledViewPool.setMaxRecycledViews有什么区别?

18
文档中说setItemViewCacheSize设置在将视图添加到可能共享的回收视图池之前要保留的屏幕外视图的数量,而setMaxRecycledViews设置在丢弃之前在池中保存的ViewHolder的最大数量。但是它们不都像高速缓存一样运作吗?换句话说,第一个设置了RV缓存的视图数,而第二个设置了RVP的视图数。当需要一个视图时,它首先从RVP还是从RV缓存中获取?对于简单的未嵌套recyclerview,两者的最佳(滚动方面,忽略内存)配置是什么?
2个回答

35
这里是 setItemViewCacheSize() 的完整文档:
设置在添加到可能共享的回收视图池之前要保留的屏幕外视图数。
屏幕外视图缓存会注意所连接的适配器中的更改,允许LayoutManager在不需要返回适配器重新绑定它们的情况下重用这些视图。
换句话说,当滚动RecyclerView以至于有一个视图刚好完全离开屏幕时,RecyclerView会将其保留,以便您可以将其滚回视图而无需重新执行onBindViewHolder()
这与回收视图池不同,后者是一组RecyclerView表示自己不再需要的视图,但仍然保留以避免膨胀新视图的昂贵任务。
简而言之,“item view cache”以这样的方式持有元素,使得RecyclerView可以避免调用onCreateViewHolder()onBindViewHolder(),而回收视图池以这样的方式持有元素,使得RecyclerView可以避免调用onCreateViewHolder(),但仍将需要调用onBindViewHolder()
此外,当需要一个视图时,它首先从RVP还是RV的缓存中取出呢?
我认为这并不重要,也不知道确切的定义,但通常我认为可以想象,刚刚退出设备视口并重新返回视口的视图将来自“item view cache”,而以前不在视口中的视图将来自回收视图池。
对于简单的未嵌套RecyclerView,两个的最佳(滚动方面,忽略内存)配置是什么呢?

只需使用默认设置。除非我已经对我的应用程序进行了分析,并确信默认设置对我不起作用,否则我绝不考虑更改这些设置。但是,如果你只是相信我所说的,忽略内存,缓存越大越好。但实际上,还是使用默认设置最好。


7
这两个的默认值是什么? - android developer
这是正确的。我一直在纠结于 setItemViewCacheSize。我不明白为什么在添加新项后,onBindViewHolder 用于更新内容的方法没有被调用,但它可以正确地显示布局。然后我意识到我修改了 setItemViewCacheSize 的值为20。将其设置为零解决了问题。 - Mihae Kheel
3
测试中发现默认的项目视图缓存大小为2,每个视图类型的默认最大回收视图数为5 - Trevor
我发现默认值非常小。这取决于你,但很可能你的视图不会占用太多内存,而且你的设备相对来说有很多内存。因此,你通常可以安全地将这些值大幅增加。 - Trevor

24
方向:

池和缓存的作用

  • 如果没有找到ViewHolder,则创建并绑定。
  • 如果在池中找到ViewHolder,则直接绑定。
  • 如果在缓存中找到ViewHolder,则无需处理。

因此,只要缓存未满,ViewHolders 就会进入缓存。如果已满,新的 ViewHolder 将把缓存“另一端”的 ViewHolder 推入池中。如果池已满,则该 ViewHolder 将被推向垃圾回收器,从而消失。

现在让我们看看池和缓存在几个 RecyclerView 的实际使用场景中是如何行事的。

考虑滚动:enter image description here

当我们向下滚动时,当前可见项后方有一个“尾部”,其中包含缓存的项和一个池化的项。当项目8出现在屏幕上时,在缓存中找不到与位置8相关的 ViewHolder:也就是说,在缓存中没有与位置8相关联的 ViewHolder。所以,我们使用了一个之前位于位置3的池化的 ViewHolder。当项目6从顶部消失时,它进入缓存,将4推入池中。

当我们开始向相反方向滚动时,情况就不同了:

方向:输入图像描述

在视图缓存中找到位置为5的ViewHolder并立即重用它,而不重新绑定。这似乎是缓存的主要用例 - 让滚动在相反方向上更加高效,以查看我们刚刚看到的项目。因此,如果您拥有新闻提要,缓存可能是无用的,因为用户不会经常返回。但如果是要选择内容的列表,比如壁纸画廊,您可能希望扩展缓存的容量。

阅读更多信息,请单击这里.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接