我希望我的 RecyclerView 不回收某些项目

2023-11-30

我正在使用一个RecyclerView里面有异质的景色,如本教程所示.

我在 RecyclerView 中有一些项目也是 RecyclerView。太难想象了?假设我想复制 Play 商店的布局:一个大的 RecyclerView,具有垂直线性布局并由许多元素填充:单个应用程序和应用程序轮播。

如果要添加的项目是单个应用程序的布局,则将使用 ID 1,并且我将为单个项目添加布局。 否则,如果我需要添加一个轮播,那么我将向主 RecyclerView 添加一个元素:另一个具有自己的适配器的 RecyclerView。

这非常有效。除非您滚动主 RecyclerView 时。为什么?因为某些视图在不再可见时被销毁,然后在onBindViewHolder()方法。为什么在这里?因为主RecyclerView的Adapter正在传递位置X,然后调用OnBindViewHolder()。然后后者使用自己的适配器创建一个新的 RecyclerView 并将其分配给它。我想保留这些观点只是因为它们每次都很难重新膨胀。

这可能吗?如果是这样,你能告诉我怎么做吗?


用这个:

recyclerView.getRecycledViewPool().setMaxRecycledViews(TYPE_CAROUSEL, 0);

这不会回收 viewType 的任何视图TYPE_CAROUSEL但如果这种类型的项目数量非常高,那么它会显着降低你的性能,甚至可能导致 OOME

如果您的适配器只有一种类型的视图,因此您不会覆盖getItemViewType(position: Int): Int方法中,您可以传递 0 作为第一个参数setMaxRecycledViews功能。


EDIT

看完之后MML13的答案,我想这可能对你有用。您担心当该视图在外部 RecyclerView 中重新绑定时,轮播中的项目会重新膨胀。如果所有这些轮播都是相同类型的,即它们都使用相同的适配器,您可以将适配器保留在外部 RecyclerView 的 ViewHolder 中,只需交换数据并调用notifyDataSetChanged() or notifyItemRangeChanged(...)重新绑定时在此适配器上。这将回收所有轮播视图以及这些轮播内的所有视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我希望我的 RecyclerView 不回收某些项目 的相关文章

随机推荐