notifyItemRemoved 遇到的坑

当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毫秒就足够了,这样,就解决了,亲测有效。

你可能感兴趣的:(notifyItemRemoved 遇到的坑)