文档说setItemViewCacheSize
设置要在将其添加到之前要保留的屏幕外视图的数量 可能共享的回收视图池。
和setMaxRecycledViews
设置之前要在池中保留的最大ViewHolders数 丢弃。
但它们是否都可以作为从中获取视图的缓存(即,第一个设置RV缓存的视图数量,而第二个设置RVP的视图数量)?
此外,当需要视图时,首先从RVP或RV的缓存中获取视图?
对于简单的unnested recyclerview,两者的最佳(滚动方式,忽略内存)配置是什么?
答案 0 :(得分:13)
以下是setItemViewCacheSize()
的完整文档:
在将其添加到可能共享的回收的视图池之前,设置要保留的屏幕外视图数。
屏幕外视图缓存会随时了解所连接适配器的更改,允许
LayoutManager
重新使用未修改的视图,而无需返回适配器重新绑定它们。
换句话说,当您滚动RecyclerView使得某个视图几乎完全不在屏幕外时,RecyclerView会将其保留,以便您可以将其滚动回视图而无需重新执行{{1 }}
这与回收视图池不同,回收视图池是RecyclerView已经表示它不再需要的视图池,但它保留了以避免昂贵的新任务视图。
简而言之,“项目视图缓存”以这样的方式保存元素,即RecyclerView可以避免调用 onBindViewHolder()
和onCreateViewHolder()
,而回收的视图池可以这些元素使得RecyclerView可以避免调用onBindViewHolder()
,但仍然需要调用onCreateViewHolder()
。
此外,当需要视图时,首先从RVP或RV的缓存中获取视图?
我认为这不重要,我不知道一个精确的定义,但一般来说我认为你可以想象刚退出设备的视口然后返回视口的视图将从“项目视图缓存”,而屏幕上但之前未在屏幕上显示的视图将来自回收的视图池。
对于简单的unnested recyclerview,两者的最佳(滚动方式,忽略内存)配置是什么?
只需使用默认值即可。我永远不会考虑改变这些,除非我描述了我的应用程序,并毫无疑问地确定默认值对我不起作用。但是,如果我只是接受你的话,忽略内存,缓存大小越大越好。但实际上,只需使用默认值。
答案 1 :(得分:5)
我读过Pavel Shmakov的这篇文章,它解释了Pool和Cache之间的区别
正在使用的池和缓存
- 如果找不到ViewHolder,则会创建并绑定它。
- 如果在池中找到ViewHolder,则绑定它。
- 如果在缓存中找到ViewHolder,则无需执行任何操作。
因此,只要缓存未满,ViewHolders就会到那里。如果它是 一个新的ViewHolder将ViewHolder从“另一端”推出 缓存到池中。如果池已满,那ViewHolder就是
的垃圾收集器被遗忘了现在让我们看一下池和缓存在几个实际中的表现方式 RecyclerView使用场景。
当我们向下滚动时,目前看到的后面有一个“尾巴” 由缓存的项目组成的项目,然后是合并的项目。当项目 屏幕上出现8,在缓存中找不到合适的ViewHolder:否 ViewHolder与位置8相关联。所以我们使用汇集 ViewHolder,之前位于第3位。当第6项消失时 在顶部,它进入缓存,将4推入池中。
在这里,我们在视图缓存中找到位置5的ViewHolder并重用它 马上,没有重新绑定。这似乎是主要的用例 高速缓存 - 以相反的方向滚动到项目 我们刚看到,效率更高。所以如果你有一个新闻源,缓存 可能没用,因为用户不会经常回去。但如果是的话 你可以选择一系列壁纸,一套壁纸 想要扩展缓存的容量。
在此处阅读更多https://android.jlelse.eu/anatomy-of-recyclerview-part-1-a-search-for-a-viewholder-404ba3453714