数组下标越界

2020-12-15  本文已影响0人  小赵不在

报错信息如下

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 20(offset:20).state:23 androidx.recyclerview.widget.RecyclerView{9e04832 VFED..C.. .F....ID 74,134-1846,1122 #7f09019e app:id/recyclerView}, adapter:com.djt.launcher.module.main.moreapp.MoreAppFragment$onGetAppInfoList$1$adapter$1@32a2983, layout:androidx.recyclerview.widget.GridLayoutManager@febc700, context:com.djt.launcher.module.main.moreapp.MoreAppActivity@502a8b8
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6183)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
    at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
    at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:561)
    at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
    at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
    at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
    at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    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:754)
    at android.view.View.layout(View.java:20848)
    at android.view.ViewGroup.layout(ViewGroup.java:6264)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2922)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2437)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1533)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7455)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:953)
    at android.view.Choreographer.doCallbacks(Choreographer.java:765)
    at android.view.Choreographer.doFrame(Choreographer.java:697)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:939)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6702)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)

我使用的是GridLayoutManager遇到的这种数组下标越界,于是我绞尽脑汁(其实也没有 哈哈哈),从网上搜寻为啥,找了半天,也没说因为个啥,就只有解决方案,如下:

 recyclerView.layoutManager = MyGridLayoutManager(activity, 6)
/**
 * 自己复写MyGridLayoutManager类,避免了由RecyclerView可能出现的holder数组越界Bug
 */

class MyGridLayoutManager(
    context: Context?,
    spanCount: Int

) : GridLayoutManager(context, spanCount) {

    override fun onLayoutChildren(
        recycler: Recycler,
        state: RecyclerView.State
    ) {
        try {
            super.onLayoutChildren(recycler, state)
        } catch (e: IndexOutOfBoundsException) {
            e.printStackTrace()
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读