解決Recyclerview重新整理資料時滑動介面造成的奔潰。
阿新 • • 發佈:2019-01-07
錯誤提示:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{775cd18 position=2 id=2, oldPos=-1, pLpos:-1 no parent}
2,錯誤分析:
當資料列表清空的時候,這時候item也沒有對應的資料,當你再滑動時由於匹配不到對應的資料所以就GG,而且並不指示是哪個地方出錯,應該是recyclerview內部處理問題。
3,解決方法:
第一種
可以在初始化的時候對recyclerView的觸控進行監聽,當處於資料更新狀態時就設定成不可滑動,更新完成則設定成可滑動,程式碼如下:
recyclerView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (mIsRefreshing) { return true; } else { return false; } } });
mIsRefreshing為狀態值 true 不能滑動 false能滑動
xRefreshView.setOnRefreshLoadmoreListener(new OnRefreshLoadmoreListener() { @Override public void onLoadmore(RefreshLayout refreshLayout) { mIsRefreshing = true; if (dates1 - dates >= 0) { dates += 1; presenter.getYouhuijuanData(); } else { xRefreshView.finishLoadmore(); } } @Override public void onRefresh(RefreshLayout refreshLayout) { mIsRefreshing = true; dates -= 1; presenter.getYouhuijuanData(); } });
當重新整理時讓mIsRefreshing的狀態為true 使recyclerView不返回觸控事件,這樣就能避免奔潰事件的產生啦。
第二種
新建一個類去繼承LinearLayoutManager,然後去重寫他的onLayoutChildren()方法
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
try {
super.onLayoutChildren(recycler, state);
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
}