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