RecyclerView数组越界异常java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position

1.情况描述:

音乐app测试,反复插拔多个U盘测试播放,概率性出现此bug:java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position

2.BUG出现的原因:

在进行数据移除和数据增加时,务必要保证Adapter中的数据和移除的数据保持一致!这是什么意思呢?就是如果你更新你的集合后,调用Adapter的新出现的notifyxxxx方法时,adapter 的更新预期结果和实际集合更新结果不同,那么就会出现异常了。

数据一致其实说的是要保证数量一致。就是说Adapter有个size,你的集合有个size。这两个size,在调用Adapter的notifyxxxx时候必须保持相同。

反复插拔U盘触发音频自动扫描,导致可能集合list的size变了,但未及时通知Adapter刷新数据就出错了。

3.解决方案:

1).方案一:将集合list和adapter的list隔开

public void setMusicInfoList(List musicList) {
        try {
            //此处list不直接赋值,赋值外层list有变化后未及时通知adapter刷新数据
            if (musicInfoList == null){
                musicInfoList = new ArrayList<>();
            }
            if (musicList != null){
                musicInfoList.clear();
                musicInfoList.addAll(musicList);
            }

            
            notifyDataSetChanged();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

2).方案二:最直接有效的解决方案,就是复写LinearLayoutManager这个类,代码如下:

public class RecyclerViewNoBugLinearLayoutManager extends LinearLayoutManager {
    public RecyclerViewNoBugLinearLayoutManager(Context context) {
        super( context );
    }
 
    public RecyclerViewNoBugLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super( context, orientation, reverseLayout );
    }
 
    public RecyclerViewNoBugLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super( context, attrs, defStyleAttr, defStyleRes );
    }
 
    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        try {
        //try catch一下
            super.onLayoutChildren( recycler, state );
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
        }
 
    }
}

你可能感兴趣的:(Android,java,开发语言,android)