我是否破坏了回收者视图的性能和使用?
Am I breaking the performance and use of a recycler view?
所以当我们想要显示大量元素列表时,我们应该使用回收视图。
这样做的好处是视图可以重复使用,所以我们不会膨胀列表中的每个视图并将它们保存在内存中,而只保存在屏幕上显示的那些视图,回收其余部分。
但是,如果回收视图本身就是一个 "mini" 列表怎么办?
IE。对于每个回收的项目,我们通过删除所有子视图并添加新的子视图来更改其结构?
这是否破坏了使用回收列表的整个想法?
有问题的示例(itemInRecycler
是一个垂直的 LinearLayout
传递给回收站视图持有者):
itemInRecycler.removeAllViews();
for(element: elements) {
CustomView view = inflate();
view.setDisplayData(element);
itemInRecycler.addView(view);
}
Is that defeating the whole idea of using a recycled list?
这取决于整个 itemView
子列表的多少。如果子列表是您唯一要显示的内容,那么是的,您将失去很大一部分性能提升。每次绑定 ViewHolder
时,您仍然在膨胀视图,这是您在使用 RecyclerView 时尽量避免的事情之一。
这也取决于子列表的大小。如果最多只有三个元素,那么成本就会降低。如果子列表有数百个项目,那么成本就很大。
一种选择是使用子 RecyclerView 而不是 LinearLayout,并将每个子 RecyclerView 连接到相同的 shared 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);
}
在 elements
集合总是包含五到七个元素的世界中,这种方法将确保您始终重复使用前五个 CustomView
,并且然后只膨胀或移除 0-2 个额外的 CustomView
s.
所以当我们想要显示大量元素列表时,我们应该使用回收视图。
这样做的好处是视图可以重复使用,所以我们不会膨胀列表中的每个视图并将它们保存在内存中,而只保存在屏幕上显示的那些视图,回收其余部分。
但是,如果回收视图本身就是一个 "mini" 列表怎么办?
IE。对于每个回收的项目,我们通过删除所有子视图并添加新的子视图来更改其结构?
这是否破坏了使用回收列表的整个想法?
有问题的示例(itemInRecycler
是一个垂直的 LinearLayout
传递给回收站视图持有者):
itemInRecycler.removeAllViews();
for(element: elements) {
CustomView view = inflate();
view.setDisplayData(element);
itemInRecycler.addView(view);
}
Is that defeating the whole idea of using a recycled list?
这取决于整个 itemView
子列表的多少。如果子列表是您唯一要显示的内容,那么是的,您将失去很大一部分性能提升。每次绑定 ViewHolder
时,您仍然在膨胀视图,这是您在使用 RecyclerView 时尽量避免的事情之一。
这也取决于子列表的大小。如果最多只有三个元素,那么成本就会降低。如果子列表有数百个项目,那么成本就很大。
一种选择是使用子 RecyclerView 而不是 LinearLayout,并将每个子 RecyclerView 连接到相同的 shared 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);
}
在 elements
集合总是包含五到七个元素的世界中,这种方法将确保您始终重复使用前五个 CustomView
,并且然后只膨胀或移除 0-2 个额外的 CustomView
s.