如何修复RecyclerView中的IndexOutOfBoundsException

时间:2018-01-08 15:09:28

标签: android android-recyclerview indexoutofboundsexception

我的应用程序中有一堆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>

如果你们需要任何其他代码,请告诉我们!

适配器代码可以在这里找到:

https://pastebin.com/HzMkCDh5

1 个答案:

答案 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