记一Bug:StaggeredGridLayoutManager :java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
崩溃
线上平台监控到一个bug,数量不多。一开始直找不到啥原因,先看报错日志:

咋一看,报错原因是数组越界了,但是你会发现具体报错位置是源码StaggeredGridLayoutManager$Span的calculateCachedStart报错了,具体如下:
void calculateCachedStart() {
final View startView = mViews.get(0);
final LayoutParams lp = getLayoutParams(startView);
mCachedStart = mPrimaryOrientation.getDecoratedStart(startView);
if (lp.mFullSpan) {
LazySpanLookup.FullSpanItem fsi = mLazySpanLookup
.getFullSpanItem(lp.getViewLayoutPosition());
if (fsi != null && fsi.mGapDir == LayoutState.LAYOUT_START) {
mCachedStart -= fsi.getGapForSpan(mIndex);
}
}
}
这里的mViews.get(0)中mViews的size为0,所以数组越界了。
复现
复现场景也找到了:使用viewpager2导致当前的fragment了,导致布局缓存的销毁,会导致调用了StaggeredGridLayoutManager#onDetachedFromWindow方法。由于我没有设置viewpager2的缓存数量(启动不多加载,启动快),在频繁切换的时候,会调用此方法。
public void onDetachedFromWindow(RecyclerView view, RecyclerView.Recycler recycler) {
super.onDetachedFromWindow(view, recycler);
removeCallbacks(mCheckForGapsRunnable);
for (int i = 0; i < mSpanCount; i++) {
//这里遍历清空了
mSpans[i

博客讲述了在使用StaggeredGridLayoutManager时遇到的一个bug,即在滑动瀑布流布局时因数组越界导致崩溃。问题源于viewpager2在切换页面时销毁了fragment,触发了StaggeredGridLayoutManager的onDetachedFromWindow方法,清空了布局缓存。解决方案包括设置viewpager2的缓存页数或重写onDetachedFromWindow方法,以及保存和恢复布局状态。此外,还讨论了改用GridLayoutManager的可能性。
最低0.47元/天 解锁文章
1185





