记一Bug:StaggeredGridLayoutManager :java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

关于Android开发中使用RecyclerView结合StaggeredGridLayoutManager的瀑布布局显示图片中出现异常空白的问题 在使用瀑布布局显示图片的过程中发现了一个异常情况,那就是本来高度都是warp_content的图片产生了异常空白的问题。 如图所示: 父布局很简单,就是一个简单的线性布局中包含了一个RecyclerView。 MainActivity中的代码为: this.pictureRecyclerView = findViewById(R.id.picture_recycler_view); StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, StaggeredGri 立即下载

记一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].clear();
        }
        // SGLM will require fresh layout call to recover state after detach
        view.requestLayout();
    }

所以在滑动瀑布流布局的时候会回调calculateCachedStart方法,导致崩溃了。

解决方案

设置viewpager2缓存数量
mViewPager.setOffscreenPageLimit(4);

这样就不会调用onDetachedFromWindow方法了,虽然解决问题了,但是启动的时候会多初始化这么多fragment,那么就影响了启动速度,这是万万不行的。不在乎启动速度,改这个就行了。

重写onDetachedFromWindow
 manager = new StaggeredGridLayoutManager(count,
                StaggeredGridLayoutManager.HORIZONTAL){
            @Override
            public void onDetachedFromWindow(RecyclerView view, RecyclerView.Recycler recycler) {
                //不处理了
            }
        };
处理SavedState
  public static class SavedState implements Parcelable {

        int mAnchorPosition;
        int mVisibleAnchorPosition; // Replacement for span info when spans are invalidated
        int mSpanOffsetsSize;
        int[] mSpanOffsets;
        int mSpanLookupSize;
        int[] mSpanLookup;
        List<LazySpanLookup.FullSpanItem> mFullSpanItems;
        boolean mReverseLayout;
        boolean mAnchorLayoutFromEnd;
        boolean mLastLayoutRTL;

        public SavedState() {
        }

        SavedState(Parcel in) {
            mAnchorPosition = in.readInt();
            mVisibleAnchorPosition = in.readInt();
            mSpanOffsetsSize = in.readInt();
            if (mSpanOffsetsSize > 0) {
                mSpanOffsets = new int[mSpanOffsetsSize];
                in.readIntArray(mSpanOffsets);
            }

            mSpanLookupSize = in.readInt();
            if (mSpanLookupSize > 0) {
                mSpanLookup = new int[mSpanLookupSize];
                in.readIntArray(mSpanLookup);
            }
            mReverseLayout = in.readInt() == 1;
            mAnchorLayoutFromEnd = in.readInt() == 1;
            mLastLayoutRTL = in.readInt() == 1;
            @SuppressWarnings("unchecked")
            List<LazySpanLookup.FullSpanItem> fullSpanItems =
                    in.readArrayList(LazySpanLookup.FullSpanItem.class.getClassLoader());
            mFullSpanItems = fullSpanItems;
        }

        public SavedState(SavedState other) {
            mSpanOffsetsSize = other.mSpanOffsetsSize;
            mAnchorPosition = other.mAnchorPosition;
            mVisibleAnchorPosition = other.mVisibleAnchorPosition;
            mSpanOffsets = other.mSpanOffsets;
            mSpanLookupSize = other.mSpanLookupSize;
            mSpanLookup = other.mSpanLookup;
            mReverseLayout = other.mReverseLayout;
            mAnchorLayoutFromEnd = other.mAnchorLayoutFromEnd;
            mLastLayoutRTL = other.mLastLayoutRTL;
            mFullSpanItems = other.mFullSpanItems;
        }

        void invalidateSpanInfo() {
            mSpanOffsets = null;
            mSpanOffsetsSize = 0;
            mSpanLookupSize = 0;
            mSpanLookup = null;
            mFullSpanItems = null;
        }

        void invalidateAnchorPositionInfo() {
            mSpanOffsets = null;
            mSpanOffsetsSize = 0;
            mAnchorPosition = RecyclerView.NO_POSITION;
            mVisibleAnchorPosition = RecyclerView.NO_POSITION;
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(mAnchorPosition);
            dest.writeInt(mVisibleAnchorPosition);
            dest.writeInt(mSpanOffsetsSize);
            if (mSpanOffsetsSize > 0) {
                dest.writeIntArray(mSpanOffsets);
            }
            dest.writeInt(mSpanLookupSize);
            if (mSpanLookupSize > 0) {
                dest.writeIntArray(mSpanLookup);
            }
            dest.writeInt(mReverseLayout ? 1 : 0);
            dest.writeInt(mAnchorLayoutFromEnd ? 1 : 0);
            dest.writeInt(mLastLayoutRTL ? 1 : 0);
            dest.writeList(mFullSpanItems);
        }

        public static final Parcelable.Creator<SavedState> CREATOR =
                new Parcelable.Creator<SavedState>() {
                    @Override
                    public SavedState createFromParcel(Parcel in) {
                        return new SavedState(in);
                    }

                    @Override
                    public SavedState[] newArray(int size) {
                        return new SavedState[size];
                    }
                };
    }

SavedState是布局的一些状态保持,对比activtiy的state是一样的。所以我重写onDetachedFromWindow方法保存状态,重写

改为GridLayoutManager

如果布局支持,可以改,GridLayoutManager滑动不会回调到calculateCachedStart方法。不建议,很Low。

总结

代码不规范,测试两行泪啊

Codex App 远程 SSH 连接 autodl 配置全攻略 SSH 远程连接是开发中常用的技术,通过加密通道实现本地与远程服务器的安全通信。其原理基于非对称加密和密钥对认证,确保数据传输安全。在 AI 开发场景中,远程连接能充分利用云端 GPU 算力,同时保留本地编辑器的流畅体验。autodl 作为主流算力云平台,支持通过 SSH 接入实例,但 Codex App 等工具需额外配置。本文详细讲解如何获取 autodl 的 SSH 接入信息、配置密钥登录、填写 Codex App 远程连接参数,并解决连接拒绝、权限报错等常见问题,帮助开发者高效搭建远程开发环境。 阅读详情

相关推荐

数字IC物理验证实战 | 从Calibre LVS报告到Innovus定位的Debug全链路解析

本文详细解析了数字IC物理验证中Calibre LVS报告的Debug全流程,从INCORRECT NETS错误的初探到Innovus定位技巧,提供了实战案例和高效工具的使用方法。重点介绍了Calibre高亮功能、Innovus验证命令以及前后端工具联动的关键策略,帮助工程师快速定位和解决LVS问题,提升物理验证效率。

weixin_30919429的博客 127

js 判断字符串为空和不为空(两种方法)

1 判断字符串为空 (1)第一种方法 var test=""; if(test==""||test==null||test==undefined){ alert("为空"); } (2)第二种方法 var test=""; if(!test){ alert("为空"); } 2 判断字符串不为空 (1)第一种方法 var test=""; if(test==""||test==null||test==undefined){ alert("为空"); } .

旭东怪的博客 7万+

AURIX TC397开发板到手第一步:用iLLD库驱动LED流水灯(附完整代码)

本文详细介绍了如何使用英飞凌AURIX TC397开发板和iLLD库实现LED流水灯效果。从开发环境配置到硬件连接,再到完整的代码实现,逐步引导开发者完成项目。文章还提供了优化建议和常见问题解决方案,帮助嵌入式开发新手快速上手。

weixin_30911451的博客 390

Java运行时出现的错误:java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的原因

这个错误的意思是没有获取到这个位置的元素。 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0。 出现时一般后面都会跟 Index: xx, Size: xx 。 具体xx不一定,出现这个错误的原因有两种: 一:索引超出边界造成的异常, 二:就是有一个数组想要去取size位置上的数据,发现没有值可以取得。 所以,归根到底是要取的值是...

大C的博客 8万+

数据资产目录(SailCatalog)和数据地图(SailMap)

笔者接下来准备开发大数据平台(XSailboat)中的数据资产目录(SailCatalog)和数据地图(SailMap)相关的功能,本文用以记录笔者关于此部分功能的概念梳理和主体功能设计。

OkGogooXSailboat的博客 2326

手把手带你搭建一个语音对话机器人:5分钟定制个人AI小助手

通过本文的简单步骤,你已经掌握了如何用 Python 搭建一个语音对话机器人。我们使用了实现语音识别,利用 OpenAI API 生成对话内容,并通过gTTS将文本转换为语音。整个流程非常简洁,你可以根据自己的需求进一步扩展机器人功能,甚至将其集成到实际的应用场景中。

小蜗牛的珍贵百宝箱 4805

报错 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 解决方案

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 笔记:错误原因有可能是在代码中if选区的结果是空值,也就是说取的是脏数据,所以导致不能继续处理,调整代码的逻辑部分就有可能会

weixin_44438884的博客 5935

【研路导航】重庆大学计算机保研面试真题分享交流

在保研的道路上,面试是非常重要的一环。轻保研提供了成功保研到重庆大学的学长的计算机保研面试的部分真题及详细解答!Q 快速排序和合并排序:快速排序(quicksort) 和合并排序(merge sort) 两种方法都将输入的待排序序列划分为2个子序列,并且递归地对所得的两个子序列分别排序。请阐述快速排序及合并排序两种算法之间的主要区别。

gradlight的博客 1587

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0与ArrayIndexOutOfBoundsException是一个东西吗?

1 问题场景 最近接了一个小项目(原生jdbc+servlet+jsp),原本正常运行的程序,出现了一个BUG,具体异常信息如下: exception java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 2 问题分析 1.刚开始猛一看以为是数组越界异常,定位到代码处发现写的是增强for,不可能会出现数组越界异常(取数时,索引超过数组长度) 2.通过报错提示index:0,size:0,我第一反映就是没连上数据库,没有查到数据,导致集合为空导致的,

双非二本自学到互联网公司的成长经历,有故事,有干货。 4853

仿真每日一练 | 有限元模态分析详解

结构的振动一直是工业领域产品分析的重点,在振动的仿真分析中,模态分析是其最基本的分析类型,通过研究结构的固有频率和振型对产品的设计提供指导。2.2、在interaction模块,通过special->Spring,在各点之间分别创建弹簧单元,弹簧刚度为1000。2.1、在interaction模块,创建两个RP点,与两侧RP点各间隔100大小,如图3所示;其中M、K、C均为n*n的矩阵,s、x、v为n*1的矢量,n为系统自由度数量。3、在Assembly模块创建装配体,两点之间的距离为100,如图2所示;

ansysxuexizhe的博客 1655

Flowable任务节点动态预测:基于任务ID与参数获取下一节点及候选分配策略

本文深入探讨了Flowable工作流引擎中任务节点动态预测功能的实现。通过解析任务ID与运行时参数,模拟流程执行路径,精准预测下一节点及候选用户/组集合,从而提升用户体验与系统透明度。核心在于利用自定义命令实现表达式求值,并深度解析候选者分配策略,确保预测结果与实际流程执行一致。

nnn11的博客 737

解决java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的问题

出现这种问题是数组值没有取到,解决办法如下: 如:List orgList=sysOrgService.getByUserId(su.getUserId());             String orgName="";             if (orgList!=null&&orgList.size()>0) {                                 o

cxws110的博客 16万+

Windows 11 安装 Miniconda + Mamba,配置国内源

本文详细介绍了在 Windows 11 系统下安装 Miniconda 并配置 Mamba 的完整流程,包括选择精简版 Miniconda 的理由、安装过程中的关键选项设置、配置清华大学镜像源以加速包下载,以及在 base 环境中设置 pip 国内源。同时说明了 Mamba 相较 Conda 的性能优势,并指导用户完成 Mamba 安装与 Shell 集成,最终通过命令验证环境管理功能,帮助用户构建高效、轻量的 Python 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3344

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

索引超出边界异常,索引0,大小0 这是报错信息,这时在报错的地方打断点调试你的list数组,如下图 调试结果: 就是ruTaskList为空,然后用一个空的list去.get,所以就报这个错误了。 这时,最好的办法就是去判断一下你的lsit是否拥有数据。 ...

wjw_de_java的博客 1586

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

BaseSavedState保存状态

/** * 读取保存状态 * */ @Override public void onRestoreInstanceState(Parcelable state) { SavedState savedState = (SavedState)state; super.onRestoreInstanceState(savedState.

u010107250的专栏 1222

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java.lang.IndexOutOfBoundsException: Index:0, Size:0

public class Test{ public static void main(String[] args){ List<String> list = new ArrayList<String>(); System.out.println(list.get(0)); } } 程序运行后报错信息是: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index:0, Size:0 at

expect521的博客 4227

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

exception java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

1.情景展示   Java 报错信息如下:   java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 2.原因分析   首先,这是越界异常,但不是数组越界异常。   数组越界的信息如下:   java.lang.ArrayIndexOutOfBoundsException   一直以为,它俩是同样的异常...

weixin_30724853的博客 1390

Recyclerview StaggeredGridLayoutManager 出现 IndexOutOfBoundsException 导致崩溃

Recyclerview StaggeredGridLayoutManager 出现 IndexOutOfBoundsException 导致崩溃 镇楼图 在项目中使用 StaggeredGridLayoutManager 来实现瀑布流,万万没想到出现崩溃的情况,通过Bugly定位问题 java.util.ArrayList.get(ArrayList.java:437) 2 androidx.recyclerview.widget.StaggeredGridLayoutManag.

lvi_166的博客 3256

报错 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayL

这个错误是由于在一个空的ArrayList中尝试访问索引0导致的。具体来说,在DisasterWeatherSMSReminderCustomersSchedule类的第376行,尝试访问一个空的ArrayList,导致IndexOutOfBoundsException异常。需要检查代码中是否正确初始化了ArrayList,或者在访问ArrayList之前添加一个空值检查。

Java&Develop的博客 1674

Java java.lang.IndexOutOfBoundsException: Index: 0, Size: 0问题解决

Java java.lang.IndexOutOfBoundsException: Index: 0, Size: 0问题解决

Java&Develop的博客 2418

常见异常(1)— java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

异常: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 原因:对于一个list在获取其中的首个元素list.get(0)时,未做判断list是否存在元素的判断 改正:if(null!=list && list.size() !=0){ list.get(0);} 注:list=null 是判断是否存在这...

baichi6785的博客 1293

排除报错java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的方式

简单翻译一下,导致这个错误的原因是索引越界异常 这时候就要检查你的索引: 1.该索引是否存在,比如你列表就六个数,你传入的是7,就不行了。 2.类型是否一致:比如需要传入一个int型的数字1,而你却写成了’1’,那也不行,新手通常会出现这个错误。 ...

m0_46544453的博客 1782

如何解决 java.lang.IndexOutOfBoundsException 异常问题?亲测有效的解决方法!

是 Java 中常见的运行时异常,表示访问了无效的索引(数组、集合、字符串等)。本文将从到,并提供和代码示例,帮你彻底解决这个问题。

猿鹏探码的博客 9963

【Java报错已解决】Java.lang.IndexOutOfBoundsException

在 Java 开发过程中,报错是不可避免的情况。而“Java.lang.IndexOutOfBoundsException”这个报错是开发者经常会遇到的问题之一。这个报错通常表示在访问数组、列表或其他集合类型的数据结构时,尝试访问了一个不存在的索引位置,从而导致程序出现异常。那么,当遇到这个报错时,我们应该如何快速有效地解决呢?本文将深入探讨这个报错的原因和解决方法,帮助开发者顺利解决此类问题。

鸽芷咕的博客 3796
上一篇: Glide 4.0+源码分析
下一篇: android 取消黑暗模式
HUandroid
博客等级 码龄10年 35粉丝 113原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值