RecyclerView.Adapter notifyItemRemoved postion错位的问题
2016-07-16 01:15
477 查看
问题:
在adapter的onBindViewHolder中设置了如下监听事件:
上面是一个item中的操作选项,当操作删除item后调用下面的移除操作
发现这个postion之后的item监听数据错乱。
原因是移除之后,没有重新刷新onBindViewHolder,导致监听的postion还是之前的。
解决:
在移动动画之后,重新刷新onBindViewHolder,使用notifyItemRangeChanged方法
附:
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
在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
相关文章推荐
- RecyclerView的notifyItemRemoved()方法删除条目问题
- Android 之 RecyclerView 连续移除Item报错
- 源码-使用组合替代继承实现新类(Using Composition Rather Than Inheritance)
- ulua使用经验
- 二叉树——重建二叉树
- JavaWeb项目中访问WEB-INF目录下的文件(以及项目目录问题)
- hihoCoder太阁最新面经算法竞赛8 A Game(区间DP)
- C# 毛玻璃效果
- 阿里云域名绑定动态ip解决方法
- SVN服务器端的使用
- OSChina 周六乱弹 ——对!今天全是妹子!
- js div中内容溢出时最新添加的元素可视化
- Broadcast Recevier回顾及自定义DeviceAdminReceiver模板完善
- 简明易懂的分布式计算模型
- express
- 360加固保 安全防护 多渠道打包
- 条件变量实例:生产者-消费者模式的后进先出型(std::stack)缓冲区
- Java解析xml文档之STAX解析
- 【数据结构】线性表
- [LeetCode] 10. Regular Expression Matching