繁体   English   中英

如何正确使用 RecyclerView.Adapter notifyItemInserted/Removed?

[英]How to use RecyclerView.Adapter notifyItemInserted/Removed in a right way?

例如,您有一个适配器,并在 onBindViewHolder 方法中将 OnClickListener 设置为某些视图(并根据视图位置在那里执行一些操作)。 您应该将final分配给方法 onBindViewHolder 的 position 参数,以便可以从 onClick() 访问它。

更改数据集(删除或添加列表中的项目)后,您调用 onItemInserted 或 onItemRemoved,这实际上在回收视图中添加/删除了一个视图,但它不会刷新其他视图,因此当您单击相邻视图时,它将打开一个屏幕或显示索引无效的数据。 为了避免这种情况,我基本上调用 notifyDatasetChanged 来调用 onBind 到所有可见视图并删除/添加一些视图。

那么如何在调用 notifyItemInserted/removed 时刷新其他视图,或者如何适当地使用这些方法?

如果插入或删除数据集中的项而不调用notifyDataSetChangedonBindViewHolder位置分配给onBindViewHolder的变量将导致不一致的状态。

要使用onItemInsertedonItemRemoved的数据应保持一致,因为它不会被重绘, onClick会在添加或删除项目之前使用此无效位置。

对于此用例和其他用例, RecyclerView.ViewHolder提供了访问其位置和id的方法:

使用getAdapterPosition()getItemId()来获取有效位置和ID。

另请参阅RecyclerView.ViewHolder提供的其他方法。

所以,我解决问题的方法是将position更改为viewHolder.getAdapterPosition()

干杯!

我建议你在插入或删除适配器内的列表后添加notifyItemRangeChanged。 这项工作适用于我的项目。

删除项目中的示例:

public void removeItem (int pos) {        
        simpanList.remove(pos);
        notifyItemRemoved(pos);
        notifyItemRangeChanged(pos, simpanList.size());//add here, this can refresh position cmiiw
    }

对于未来的读者,这就是我在 recyclerview 中插入/删除时所做的例如,我的 model class 是CarsModel

在我的适配器中

    ArrayList<CarsModel> carsModel;

在 onBindViewHolder 中

    CardModel model = carsModel.get(position);

使用持有人中的按钮删除列表中的数据时:

    int position = holder.getAdapterPosition();
    carsModel.remove(position);
    notifyItemRemoved(position);

然后插入的时候

    carsModel.add(0, model);
    notifyItemInserted(0);

或插入最后一行

    carsModel.add(carsModel.size() - 1 , model);
    notifyItemInserted(carsModel.size()-1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM