1. 程式人生 > >Android 解決java.lang.IndexOutOfBoundsException: Inconsistency detected錯誤

Android 解決java.lang.IndexOutOfBoundsException: Inconsistency detected錯誤

這裡寫圖片描述

  今天測試突然找我說專案在重新整理資料時偶現crash情況,經過反覆測試終於重現出此錯誤日誌,如圖所示,看到此錯誤資訊我當時也是一臉懵逼,沒有報具體哪段程式碼的錯誤資訊,而是報RecyclerView內部錯誤,於是經過google一番終於找到此錯誤原因,在此記錄下解決方法:
  

1、建立一個繼承LinearLayoutManager的類,重寫onLayoutChildren方法,捕獲異常,使專案不會crash掉:

public class WrapContentLinearLayoutManager extends LinearLayoutManager {
    //... constructor
@Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { try { super.onLayoutChildren(recycler, state); } catch (IndexOutOfBoundsException e) { Log.e("probe", "meet a IOOBE in RecyclerView"); } } }

2、採用notifyItemRangeRemoved + notifyItemRangeInserted方式:

int oldContentSize = itemsBeanList.size();//獲取重新整理前資料長度
itemsBeanList.clear();
adapter.notifyItemRangeRemoved(0,oldContentSize );
itemsBeanList.addAll(newContentList);//新增新資料
//下拉重新整理時oldContentSize為0,上拉載入時為之前資料長度
adapter.notifyItemRangeInserted(oldContentSize,newContentList.size
());

總結
  
  經自己測試,上面兩個方法都是有效的,這個錯誤原因應該是adapter中資料集不一致而導致的,只需要解決外部資料集和內部資料集保持同步更新即可。有關notifyItemRangeRemoved 和notifyItemRangeInserted的含義,這裡就不多說了,想了解的可以去API文件中閱讀,多讀讀文件對自己很有幫助的。哈哈!