如何以正确的方式使用RecyclerView.Adapter notifyItemInserted / Removed?

时间:2016-03-05 09:38:01

标签: android android-recyclerview

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

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

那么在调用notifyItemInserted / removed或如何正确使用这些methot时如何刷新其他视图?

3 个答案:

答案 0 :(得分:10)

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

要使用onItemInsertedonItemRemoved,视图中的数据应保持一致,因为它不会被重新绘制,而onClick将使用之前分配的 <}的无效位置添加或删除了一个项目。

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

使用getAdapterPosition()getItemId()获取有效的职位和ID。

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

答案 1 :(得分:1)

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

<强>干杯!

答案 2 :(得分:0)

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

删除项目示例:

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