当前位置: 首页 > 知识库问答 >
问题:

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

傅玮
2023-03-14

文档说 setItemViewCacheSize

设置在将屏幕外视图添加到可能共享的回收视图池之前要保留的屏幕外视图数。

setMaxRecycledViews

设置丢弃前池中可容纳的最大视图持有者数量。

但是,它们不是都充当从中获取视图的缓存(即,第一个设置RV缓存的视图数,而第二个设置RVP的视图数)吗?

此外,当需要视图时,首先从RVP或RV的缓存中获取视图的位置?

对于一个简单的非嵌套回收视图,两者的最佳(滚动方式,忽略内存)配置是什么?

共有2个答案

百里成仁
2023-03-14

我读过Pavel Shmakov的这篇文章,它解释了Pool和Cache之间的区别。

运行中的池和缓存

  • 如果无处找不到 ViewHolder,则会创建并绑定它。
  • 如果在池中找到 ViewHolder,则该视图持有者已绑定。
  • 如果在缓存中找到 ViewHolder,则无需执行任何操作。

所以,只要缓存没有满,视图持有者就会去那里。如果已满,新的ViewHolder会将ViewHolder从缓存的“另一端”推入池中。如果一个池已经满了,那么这个ViewHolder将被推到垃圾收集器(即

现在,让我们看看池和缓存在两个实际的RecyclerView使用场景中的行为方式。

当我们向下滚动时,当前看到的项目后面有一个“尾巴”,由缓存项目组成,然后是一个池化项目。当项目8出现在屏幕上时,在缓存中找不到合适的ViewHolder:那里没有与位置8关联的ViewHolder。所以我们使用一个池化的ViewHolder,它以前位于位置3。当项目6在顶部消失时,它会转到缓存,将4推入池中。

在这里,我们为视图缓存中的位置 5 找到一个 ViewHolder,并立即重用它,而无需重新绑定。这似乎是缓存的主要用例 - 使向相反方向滚动,即我们刚刚看到的项目,更加高效。因此,如果您有新闻源,缓存可能毫无用处,因为用户不会太频繁地返回。但是,如果它是可供选择的内容列表,例如壁纸库,则可能需要扩展缓存容量

点击此处了解更多信息https://Android . JL else . eu/anatomy-of-recycle view-part-1-a-search-for-a-view holder-404 ba 3453714

贾越
2023-03-14

以下是setItemViewCacheSize()的完整文档:

设置将屏幕外视图添加到可能共享的循环视图池之前要保留的视图数。

屏幕外视图缓存可随时了解连接的适配器中的更改,从而允许布局管理器在未修改的情况下重用这些视图,而无需返回适配器重新绑定它们。

换言之,当您滚动RecyclerView以使视图几乎完全脱离屏幕时,RecyclerView将保留该视图,以便您可以将其滚动回视图,而无需重新执行onBindViewHolder()

这与回收的视图池不同,后者是RecyclerView表示不再需要的视图池,但保留它以避免膨胀新视图的昂贵任务。

简而言之,“项目视图缓存”以这样的方式保存元素,即RecyclerView可以避免调用<code>onCreateViewHolder()</code>和<code>onBindViewHolder()。

此外,当需要视图时,首先从RVP或RV的缓存中获取视图的位置?

我认为这并不重要,我也不知道确切的定义,但一般来说,我认为您可以想象刚刚退出设备视口然后返回视口的视图将从“项目视图缓存”中获取,而屏幕上出现但之前没有出现在屏幕上的视图将来自回收的视图池。

对于一个简单的非嵌套回收视图,两者的最佳(滚动方式,忽略内存)配置是什么?

只需使用默认值即可。我永远不会考虑更改这些,除非我已经分析了我的应用程序并确定毫无疑问的默认值对我不起作用。但是,如果我只是听你的话,忽略内存,缓存大小越大越好。但实际上,只需使用默认值即可。

 类似资料:
  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。

  • 本文向大家介绍<%# %> 和 <% %> 有什么区别?相关面试题,主要包含被问及<%# %> 和 <% %> 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块  

  • 问题内容: 以下代码之间有什么区别: 和 Python建议采用一种做事方式,但有时似乎不止一种。 问题答案: 一个是函数调用,一个是文字: 使用第二种形式。它更具Python风格,并且可能更快(因为它不涉及加载和调用单独的函数)。

  • 发展至今(2020 年 6 月份),GCC 编译器已经更新至 10.1.0 版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ 。 除此之外,当下的 GCC 编译器还支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序,甚至于 GCC 6 以及之前的版本还支持编译 Java 程序。但本

  • 问题内容: 比较PMD和CheckStyle有一个问题。但是,我找不到关于PMD和FindBugs之间差异/相似性的详尽分类。我相信一个关键的区别是PMD适用于源代码,而FindBugs适用于编译的字节码文件。但是就功能而言,这应该是一个选择,还是两者相辅相成? 问题答案: 我同时使用。我认为他们是相辅相成的。 正如您所说,PMD在源代码上工作,因此会发现诸如以下问题:违反命名约定,缺少花括号,放

  • 问题内容: 我被要求在portlet和门户网站上工作。 我想知道portlet和servlet之间的区别吗? Portlet与Servlet有何不同之处(可能在功能上)? 问题答案: Portlet是JSR-168标准的一部分,该标准规范门户容器和组件。这与Web容器(和Servlet)的标准不同。尽管这两个标准之间肯定有很强的相似之处,但是它们在容器,API,生命周期,配置,部署等方面有所不同。