Android 解決java.lang.IndexOutOfBoundsException: Inconsistency detected錯誤
阿新 • • 發佈:2019-02-01
今天測試突然找我說專案在重新整理資料時偶現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文件中閱讀,多讀讀文件對自己很有幫助的。哈哈!