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

我是否破坏了循环利用者观点的性能和使用?

萧星火
2023-03-14

因此,当我们想要显示一个大的元素列表时,我们应该使用recycler视图
这样做的好处是视图可以重复使用,因此我们不会膨胀列表中的每个视图,并将它们保存在内存中,只需将屏幕上显示的视图保存在内存中,其余视图就可以循环使用
但是如果回收视图本身就是一个“迷你”列表呢
也就是说,对于回收的每个项目,我们通过删除所有子视图并添加新的子视图来更改其结构<这是不是挫败了使用循环列表的整个想法
问题中的示例(itemInRecycler是传递给回收器视图持有者的垂直LinearLayout):

itemInRecycler.removeAllViews();  
for(element: elements) {  
   CustomView view = inflate();  
   view.setDisplayData(element);  
   itemInRecycler.addView(view);  
} 

共有1个答案

强烨
2023-03-14

这是不是破坏了使用回收清单的想法?

这取决于子列表占整个itemView的多少。如果子列表是您唯一显示的内容,那么是的,您正在击败很大一部分性能增益。每次绑定ViewHolder时,您仍然在膨胀视图,这是您在使用回收站视图时试图避免的事情之一。

这还取决于子列表的大小。如果最多只有三个要素,那么成本就会降低。如果子列表是数百个项目,那么成本就很大。

一种选择是使用子RecyclerView而不是LinearLayout,并将每个子RecyclerView连接到相同的共享RecycledViewPool。这样,您可以获得RecyclerView与可滚动的LinearLayout的所有优势,但更好的是,每个子RecyclerView都可以从其他子RecyclerView中获取ViewHolders。

如果这对您来说有点过于繁重,您可能只需要优化已经编写的代码。不必每次都清除列表,然后重新膨胀正确的视图数,您可以重新使用现有视图(如果视图不够,只创建新视图),如果视图太多,则删除额外的视图。

int i = 0;

// reuse existing views
for (; i < elements.size() && i < itemInRecycler.getChildCount(); i++) {
    Element element = elements.get(i);
    CustomView view = (CustomView) itemInRecycler.getChildAt(i);
    view.setDisplayData(element);
}

// create new views if there weren't enough to reuse
for (; i < elements.size(); i++) {
    Element element = elements.get(i);
    CustomView view = inflate();
    view.setDisplayData(element);
    itemInRecycler.addView(view);
}

// remove any extras after we've reused everything
int viewsToRemove = itemInRecycler.getChildCount() - i;

if (viewsToRemove > 0) {
    itemInRecycler.removeViews(i, viewsToRemove);
}

在一个元素集合总是有五到七个元素的世界里,比如说,这种方法将确保您总是使用前五个自定义视图s,然后只增加或删除0-2个额外的自定义视图s。

 类似资料:
  • 在循环中,我们不断终止条件,并在每一次传递中检查这些条件。 我见过2种检查方法 1.或

  • 问题内容: 有什么方法可以使用函数打破无限循环吗?例如, 这将导致以下错误: 请说明为什么会发生这种情况以及如何解决。 问题答案: 就我而言,您不能从内部调用break,但是可以使其返回值( 例如:boolean )以停止无限循环 编码:

  • 我有一个简单的积垢项目称为过滤器。在这里,每个过滤器都被分配给一个带有外键的类别。我试图做的是循环遍历每个foregin键,以获得类别名称,而不是显示给用户的id。 我首先获取所有过滤器,并执行模具/转储以检查所有结果是否存在。 尝试将类别名称分配给正确的数组项时,出现以下错误: msgstr"间接修改App\Filter的重载元素没有效果" 所以为了检查发生了什么,我在foreach循环中死了/

  • 问题内容: 我知道Go中没有析构函数,因为从技术上讲没有类。这样,我用来执行与构造函数相同的功能。但是,有没有办法在终止的情况下创建某些东西来模仿析构函数,例如使用关闭文件?现在,我只是打电话给我,但这有点荒唐,我认为设计很差。正确的方法是什么? 问题答案: 在Go生态系统中,存在一种处理包装了宝贵(和/或外部)资源的对象的惯用语:一种专门用于释放该资源的特殊方法,通常通过该机制进行 显式 调用。

  • 问题内容: 考虑以下代码: 为什么会出现这些错误? 问题答案: 二进制浮点数学就是这样。在大多数编程语言中,它基于IEEE754标准。问题的症结在于数字以这种格式表示为整数乘以2的幂。分母不是2的幂的有理数(例如,是)无法精确表示。 对于标准格式,表示形式可以完全按照 以十进制表示,或 以C99十六进制表示法表示。 相比之下,合理数量0.1,这是1/10可以完全按照书面 以十进制表示,或 以C99

  • 我在玩jmh,在关于循环的部分,他们说 您可能会注意到重复次数越多,被测量操作的“感知”成本就越低。到目前为止,我们每次添加都使用1/20 ns,远远超出了硬件的实际能力。发生这种情况是因为循环被大量展开/流水线化,并且要测量的操作是从循环中提升的。士气:不要过度使用循环,依靠JMH来获得正确的测量。 我自己也试过了 并得到以下结果: 它确实显示了MyBenchmark。MeasureError\