例如,您有一个适配器,并且在onBindViewHolder方法中,您可以将OnClickListener设置为某些视图(并根据视图位置执行某些操作)。您应该将final
分配给方法onBindViewHolder的位置参数,以便可以从onClick()访问它。
更改数据集(删除或添加列表中的项目)后,您调用onItemInserted或onItemRemoved,这确实在recyclerview中添加/删除了一个视图,但它不刷新其他视图,因此当您单击邻居视图项时,它将打开一个屏幕或显示无效索引的数据。为了避免这种情况,我基本上调用notifyDatasetChanged来调用onBind到所有可见视图并删除/添加一些视图。
那么在调用notifyItemInserted / removed或如何正确使用这些methot时如何刷新其他视图?
答案 0 :(得分:10)
如果插入或删除数据集中的项目而未调用onBindViewHolder
,则将位置分配给notifyDataSetChanged
中的变量将导致状态不一致。
要使用onItemInserted
或onItemRemoved
,视图中的数据应保持一致,因为它不会被重新绘制,而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
}