报错信息如下
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()
}
}
}
网友评论