我的应用程序中有一堆RecyclerViews,现在已经在Fabric中看到了这个例外。
Stacktrace:
Fatal Exception: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 8(offset:8).state:11 android.support.v7.widget.RecyclerView{3914473e VFED.... ........ 0,0-1080,1509 #7f11017a app:id/chatlist_recycler_view}, adapter:com.myapp.application.a.c@134b699f, layout:android.support.v7.widget.LinearLayoutManager@1449aec, context:com.myapp.application.activities.HomeActivity@1fcf5f5e
at android.support.v7.widget.RecyclerView$Recycler.clear(Unknown Source)
at android.support.v7.widget.GapWorker.add(Unknown Source)
at android.support.v7.widget.GapWorker.add(Unknown Source)
at android.support.v7.widget.GapWorker.remove(Unknown Source)
at android.support.v7.widget.GapWorker.add(Unknown Source)
at android.support.v7.widget.GapWorker.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5951)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
查看此更新的堆栈跟踪,我的chatlist_recycler_view
似乎是个问题。
我该如何调试并修复它?我不知道是什么导致了IndexOutOfBoundsException。
RecyclerView声明中的代码:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/chatlist_recycler_view"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:isScrollContainer="false"/>
</RelativeLayout>
如果你们需要任何其他代码,请告诉我们!
适配器代码可以在这里找到:
答案 0 :(得分:2)
嗯, IndexOutOfBoundsException 异常是常见的异常,但就Recyclerview而言,您可以更改以避免异常。
1:分配布局适配器时,只需禁用预测动画
mRecyclerView.setLayoutManager(new LinearLayoutManager(this){
@Override
public boolean supportsPredictiveItemAnimations() {
return false;
}
});
2:您可以尝试清除现有的回收站,然后在大数据集的情况下通知数据更改。
mRecyclerView.getRecycledViewPool().clear();
mAdapter.notifyDataSetChanged();
3:不要仅使用notifyItem.....()
使用notifyDataSetChanged()
4:如果以后从API获取数据,您可以尝试再次交换适配器
swapAdapter(adapter, true)
5:确保您没有在启动时将recyclerview滚动到某个位置,如果数据不一致,这也可能导致与索引相关的问题。
链接:source