RecyclerView问题记录IllegalStateException 2018-12-27

在RecyclerView向上滑动中,用
recyclerView.addOnChildAttachStateChangeListener的onChildViewDetachedFromWindow方法中删除dadpter里的items

mItems.remove(j);
notifyItemRangeChanged(j, 1);//这行去刷新

会出现如下错误,大意是在滚动状态中无法刷新

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling

如果不notifyXXX的话,又会出现如下之类的错误,大意是items变了之后,因为没有即时刷新(调用notifyXXX之类的方法)造成的错误

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 11(offset:11).state:15

感觉卡在了这里,最后是这么改的

rv_english.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
            @Override
            public void onChildViewAttachedToWindow(View view) {
//                MyLog.d(TAG,"被加载="+rv_english.getChildAdapterPosition(view));
            }

            @Override
            public void onChildViewDetachedFromWindow(View view) {
//                MyLog.d(TAG,"被释放="+rv_english.getChildAdapterPosition(view));
                int Childpos = rv_english.getChildAdapterPosition(view);
                View view2;
                view2 = view.findViewById(R.id.ll_main_rv_myget);
                if(view2!=null&&view2.getVisibility()==View.VISIBLE){
                        adapter_english_mv.deleteData(Childpos);
                        ////////上面这行去adapter里mItems.remove(j);
                        Handler handler = new Handler();
                        final Runnable r = new Runnable() {
                            public void run() {
                                adapter_english_mv.notifyDataSetChanged();
                                //////////然后这里notify
                            }
                        };
                        handler.post(r);
                }
            }
        });

附上最后面的文献的建议

  • 靠谱的解决办法

    显然,上面的方法都不太好用,继续研究发现,直接采用下面的方法可以很好的解决。

    经过多番研究发现,直接像下面这样,可以完美解决我们的问题。

保证Adapter内的list和获取到的数据list不是同一个list就好.

Class MyAdapter extends RecyclerView.Adapter{
    private ListmList;
    ...

 public void notifySetListDataChanged(Listlist){
      this.mList = list;
      notifyDataSetChanged();
    }
}

每次数据更新(只要有变动都认为是更新)都调用

adapter.notifySetListDataChanged(list);这里的list是变动更新后的数据list;

[IndexOutOfBoundsException参考网页]https://blog.csdn.net/u012964796/article/details/76071598
[IndexOutOfBoundsException参考网页]https://www.jianshu.com/p/a15764f6d673
[这篇写的很详细]http://www.cnblogs.com/fuyaozhishang/p/6991221.html

你可能感兴趣的:(RecyclerView问题记录IllegalStateException 2018-12-27)