我正在尝试理解setRecycledViewPool
方法与RecyclerView一起使用时,下面这行代码中的mrecyclerView
是一个RecyclerView对象:
mrecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
我阅读了Android文档中的链接,但仍然不清楚它的作用。 有人可以解释一下它的用途和何时使用吗?
我正在尝试理解setRecycledViewPool
方法与RecyclerView一起使用时,下面这行代码中的mrecyclerView
是一个RecyclerView对象:
mrecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
我阅读了Android文档中的链接,但仍然不清楚它的作用。 有人可以解释一下它的用途和何时使用吗?
setRecycledViewPool(...)
可以在我们有嵌套的 RecyclerView 时非常有用。详情请参见该博客文章。下面添加了同一个链接的简短描述。
考虑这样一个情况,您有一个嵌套的RecyclerView
,内部RecycleView
共享相同的视图结构。RecycledViewPool
提供了一种无缝的方式在这些内部(嵌套)RecyclerView
之间共享视图。
以下是这种情况的示例图:
如您所见,两个列表的视图类型是相同的。
根据文档:
回收视图池允许多个 RecyclerView 共享一组常用的废弃视图,这在多个使用相同视图类型适配器的 RecyclerView 中非常有用,例如在多个数据集中使用由 ViewPager 显示的相同类型的项视图。
默认情况下,每种 viewType 的池中保留5个ViewHolder
。如果您想更改该计数,可以按如下方式进行:
recyclerView.getRecycledViewPool()
.setMaxRecycledViews(SOME_VIEW_TYPE, POOL_CAPACITY);
来自这篇博客文章:
那么我们如何选择最佳的池大小呢?看起来最优策略是在需要更大之前扩展池大小,在之后立即缩小池大小。实现这一点的一种简单方法是:
recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 20);
adapter.notifyDataSetChanged();
new Handler().post(new Runnable() {
@Override
public void run() {
recyclerView.getRecycledViewPool()
.setMaxRecycledViews(0, 1);
}
});
fun RecyclerView.setMaxViewPoolSize(maxViewTypeId: Int, maxPoolSize: Int) {
for (i in 0..maxViewTypeId)
recycledViewPool.setMaxRecycledViews(i, maxPoolSize)
}
使用方法:
recyclerView.setMaxViewPoolSize(MAX_TYPE_FOR_THE_ADAPTER_YOU_MADE, Int.MAX_VALUE)
我个人不理解为什么这不是默认行为。使用RecyclerView的整个意义就在于回收视图。当滚动时,应该默认回收刚刚使用过的视图。
我自己没有使用过,但从文档中可以理解到这是一种在一个RecyclerView中重复使用视图的方法,可以在另一个RecyclerView中使用。
因此,如果您有一个带有许多装饰好的CardView的RecyclerView,并且您想要将这些相同的视图用于另一个RecyclerView,则可以传递共享的RecycledViewPool。现在两个RecyclerView都将从共享视图池中获取。