当Google推出RecyclerView后,我们用它代替以往的ListView,在RecyclerView.Adapter中新增了notifyItemRemoved方法用以删除某条数据,不再跟以往一样整个刷新,而是只更新单一数据,还伴随有动画。一般用法为:
mDatas.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mDatas.size());
但在使用中,发现有些坑需要注意:
- 删除错乱
- IndexOutOfIndexException
- IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
对于第一第二点问题,我们可以这样解决:
public void remove(int position) {
//解决数据更新和滑动直接的冲突
new android.os.Handler().post(() -> {
mDatas.remove(position);
notifyItemRemoved(position);
//防止删除错乱 IndexOutOfIndexException等问题
notifyItemRangeChanged(position, mDatas.size());
});
}
添加以上代码后,在我们快速删除的时候,还是会出现问题,主要是因为notifyItemRangeChanged这个方法中开启了多线程,可以用如下方法解决:
holder.setOnChangeListener(R.id.iv_collect, (buttonView, isChecked) -> {
if(isDeleteAble){
isDeleteAble = false;
remove(position);
new Thread(() -> {
try {
Thread.sleep(250);
} catch (InterruptedException e) {
e.printStackTrace();
}
isDeleteAble = true;
}).start();
}
});
当点击删除按钮以后,休息250毫秒,因为在官方的操作执行中发现,
private long mAddDuration = 120;
private long mRemoveDuration = 120;
private long mMoveDuration = 250;
private long mChangeDuration = 250;
所以250毫秒就足够了,这样,就解决了,亲测有效。