RecyclerView中的setRecycledViewPool方法

16

我正在尝试理解setRecycledViewPool方法与RecyclerView一起使用时,下面这行代码中的mrecyclerView是一个RecyclerView对象:

mrecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());

我阅读了Android文档中的链接,但仍然不清楚它的作用。 有人可以解释一下它的用途和何时使用吗?

4个回答

23

setRecycledViewPool(...) 可以在我们有嵌套的 RecyclerView 时非常有用。详情请参见博客文章。下面添加了同一个链接的简短描述。

考虑这样一个情况,您有一个嵌套的RecyclerView,内部RecycleView共享相同的视图结构。RecycledViewPool 提供了一种无缝的方式在这些内部(嵌套)RecyclerView之间共享视图。

以下是这种情况的示例图:

enter image description here

如您所见,两个列表的视图类型是相同的。


4
我们还需要注意点击项的侦听器。如果我们使用多个RecyclerView,那么我们的项可能具有相同的位置,因此单击事件可能会重叠。 - Aliaksei
1
那你建议怎么避免这种情况呢?是为每个Recycler创建一个单独的适配器还是使用同一个适配器? - Moustafa EL-Saghier

19

根据文档

回收视图池允许多个 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);
    }
});

3
当RecyclerView预计同时在屏幕上显示超过5个视图时(5是当前默认值),建议将其放大到您认为可能是最大值。这将允许在滚动时进行实际的回收(RecyclerView的目的...)以避免重建视图。
实际上,因为我认为几乎从不知道将在屏幕上显示多少(不同的屏幕分辨率等...),所以我认为最好将其设置为最大值:
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的整个意义就在于回收视图。当滚动时,应该默认回收刚刚使用过的视图。


救命稻草!我们遇到了一个问题,当元素数量达到一定数量(5个)时,“onCreateViewHolder”会被重复调用。这篇文章一下子回答了许多问题。谢谢。 - Beko
@Beko,我个人认为这个问题现在已经不存在了,没有人应该再使用它,也许我错了。很奇怪。你能否进一步研究一下?也许我对此有误解。 - android developer
嘿,抱歉,我忘了回复你。你为什么认为这不再是一个问题了呢?无论如何,我可能需要深入研究一下。最近我在使用RecyclerView时遇到了一些麻烦。 - Beko
1
@Beko 我不知道。我认为现在应该不再需要了。请检查一下并让我知道。 - android developer

2

我自己没有使用过,但从文档中可以理解到这是一种在一个RecyclerView中重复使用视图的方法,可以在另一个RecyclerView中使用。

因此,如果您有一个带有许多装饰好的CardView的RecyclerView,并且您想要将这些相同的视图用于另一个RecyclerView,则可以传递共享的RecycledViewPool。现在两个RecyclerView都将从共享视图池中获取。


该项目听起来非常有趣...我一定想更多地了解,你能否举些例子并进行实现说明一下呢? - Abhilash Reddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接