RecyclerView瘋狂報錯!??! Inconsistency detected.

最近使用RecyclerView的一個頁面一直在瘋狂報錯,但是不是必現(xiàn),摸獎式復現(xiàn)。

報錯內(nèi)容如下:

    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 1(offset:1).state:11 android.support.v7.widget.RecyclerView{8ace96a VFED..... ......ID 0,0-1080,1523 #7f090107 app:id/home_recycler_view}, adapter:com.beiins.baseRecycler.base.RViewAdapter@2b9de5b, layout:android.support.v7.widget.LinearLayoutManager@4596f8, context:com.beiins.dolly.activity.HomeActivity@29cea07
            at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5817)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
            at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
            at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
            at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
            at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
            at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at com.scwang.smartrefresh.layout.SmartRefreshLayout.onLayout(SmartRefreshLayout.java:684)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at com.android.internal.policy.DecorView.onLayout(DecorView.java:761)
            at android.view.View.layout(View.java:19612)
            at android.view.ViewGroup.layout(ViewGroup.java:6055)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2530)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2246)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1426)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6873)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1029)
            at android.view.Choreographer.doCallbacks(Choreographer.java:841)
            at android.view.Choreographer.doFrame(Choreographer.java:772)

有用的信息就是java.lang.IndexOutOfBoundsException: Inconsistency detected.這啥意思?數(shù)組越界!確實是對數(shù)據(jù)源有刪除操作,但是為什么不是必現(xiàn)呢?

因為我是在子線程中刪除的數(shù)據(jù)源,導致RecyclerView在onLayoutChildren的時候不知道有一個數(shù)據(jù)已經(jīng)被移除了,所以出現(xiàn)數(shù)組越界。

網(wǎng)上有幾個的解決方案都是什么重寫LinearLayoutManager,這根本治標不治本。記錄一下,方便遇到這個問題的人。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容