您的位置:首页 > 其它

RecyclerView.Adapter notifyItemRemoved postion错位的问题

2016-07-16 01:15 477 查看
问题:

在adapter的onBindViewHolder中设置了如下监听事件:

myViewHolder.operationView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOperationClickListener.onItemClick(myViewHolder.operationView,position);
}
});


上面是一个item中的操作选项,当操作删除item后调用下面的移除操作

mPlans.remove(postion);
mAdapter.notifyItemRemoved(postion);

发现这个postion之后的item监听数据错乱。

原因是移除之后,没有重新刷新onBindViewHolder,导致监听的postion还是之前的。

解决:

在移动动画之后,重新刷新onBindViewHolder,使用notifyItemRangeChanged方法

mPlans.remove(postion);
mAdapter.notifyItemRemoved(postion);
mAdapter.notifyItemRangeChanged(postion,mPlans.size()-postion);


附:

notifyItemChanged(int position),position数据发生了改变,那调用这个方法,就会回调对应position的onBindViewHolder()方法了,当然,因为ViewHolder是复用的,所以如果position在当前屏幕以外,也就不会回调了,因为没有意义,下次position滚动会当前屏幕以内的时候同样会调用onBindViewHolder()方法刷新数据了。其他的方法也是同样的道理。

public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可以使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可以使用默认的,也可以自己定义。

public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可以使用这个方法刷新

public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。

public final void notifyItemRemoved(int position),第position个被删除的时候刷新,同样会有动画。

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量删除。

参考:http://www.cnblogs.com/tiantianbyconan/p/4232560.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  notifyItemRemoved