我希望我的RecyclerView不回收一些物品

Joa*_*huk 28 android android-layout android-recyclerview

我在RecyclerView内部使用异构视图,如本教程中所示.

我在RecyclerView里面有一些物品也是RecyclerViews.难以想象?假设我要复制Play商店的布局:一个具有垂直线性布局的大型RecyclerView,并由许多元素填充:单个应用程序和应用程序轮播.

如果要添加的项目是单个应用程序的布局,则将使用ID 1,我将添加单个项目的布局.另外,如果我需要添加一个Carousel,那么我将在主RecyclerView中添加一个元素:另一个带有自己的适配器的RecyclerView.

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

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

Sou*_*abh 64

用这个:

recyclerView.getRecycledViewPool().setMaxRecycledViews(TYPE_CAROUSEL, 0);
Run Code Online (Sandbox Code Playgroud)

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

编辑

在阅读MML13的答案后,我认为它可能适合你.当您在外部RecyclerView中重新绑定该视图时,您担心旋转木马的项目会被重新充气.如果所有这些轮播都是相同的类型,即它们都使用相同的适配器,您可以将适配器保持在RecyclerView的ViewHolder外部,只需交换数据并在重新绑定时调用notifyDataSetChanged()notifyItemRangeChanged(...)使用此适配器.这将回收所有轮播视图和这些轮播内的所有视图.

  • @Sanoop除非你覆盖`getItemViewType`,否则默认的viewType是'0`(见[this](https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v7/recyclerview/ SRC /安卓/支持/ V7 /空间/ RecyclerView.java#5818)) (3认同)
  • `int viewType` 参数传递的默认值是多少?我找不到任何文档? (2认同)

Yyy*_*Yyy 28

您还可以在适配器的onBindViewholder()方法中设置以下代码.

holder.setIsRecyclable(false);
Run Code Online (Sandbox Code Playgroud)

我已经从这个链接中参考了

http://aphoe.com/blog/prevent-androids-recyclerview-recycling-views/


小智 9

因为某些视图在不再可见时被销毁,然后在onBindViewHolder()方法中重新创建.

事实并非如此,他们不会再创造,他们只是重新绑定.如果您有位置X的视图(在废料或回收商中)RecyclerView将使用它并重新绑定它.

我想保留这些观点只是因为它们每次重新充气都很重要.

主要RecyclerView为您保留这些.您只需要更改第二个的适配器数据RecyclerView并调用notifyDataSetChanged.还要将第二个RecyclerView适配器存放viewHolder在主机内RecyclerView.


小智 6

在您的活动中设置以下行

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

在 RecyclerViewAdapter 类中设置下面的代码

@Override
    public int getItemViewType(int position) {
        return 1;
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以添加适配器:

@Override
public void onBindViewHolder(final CommentViewHolder viewHolder, final int position) {
    viewHolder.setIsRecyclable(false);
}
Run Code Online (Sandbox Code Playgroud)

通知回收者该物品是否可以回收。不可回收的视图setIsRecyclable()在以后设置为true 之前不会再用于其他项目。的呼叫setIsRecyclable()应始终配对(一个呼叫setIsRecyclabe(false)应始终与以后的匹配setIsRecyclable(true))。成对的调用可以嵌套,因为状态在内部是引用计数的。