我正在使用一个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(使用前将#替换为@)