RecyclerView合并两个Adapter应用启动报空指针崩溃问题求助
RecyclerView合并双Adapter空指针崩溃排查结果
核心崩溃原因
androidx.recyclerview:recyclerview:1.2.0-alpha02版本提供的多Adapter合并工具ConcatAdapter在初始化阶段,会主动遍历所有传入的子Adapter并调用hasStableIds()方法做全局状态对齐。你遇到的空指针是因为传入ConcatAdapter构造方法的两个自定义Adapter中,存在至少一个未完成初始化的空对象,导致系统调用空对象的hasStableIds()方法触发崩溃。
必查修复点
- 检查Activity中Adapter初始化顺序:必须先完成两个自定义Adapter的实例化(传入上下文、初始数据源等必要参数),再将两个非空的Adapter实例传入
ConcatAdapter构造方法,禁止先传入空引用后再给Adapter变量赋值 - 检查自定义Adapter的
hasStableIds()重写逻辑:如果重写了该方法,确保返回值不依赖未完成加载的空数据源,不要在Adapter构造方法中做异步延迟初始化核心成员 - 依赖版本优化:
1.2.0-alpha02属于未正式发布的测试版本,本身存在ConcatAdapter参数校验缺失的问题,可升级到正式版androidx.recyclerview:recyclerview:1.3.2,该版本新增了构造阶段非空校验,会抛出明确的参数异常而非无意义的空指针,更便于排查问题
快速验证方法
在初始化ConcatAdapter之前添加日志确认两个子Adapter是否为空:
// Java 示例 Log.d("DEBUG_ADAPTER", "FirstAdapter实例:" + firstAdapter + " SecondAdapter实例:" + secondAdapter);
// Kotlin 示例 Log.d("DEBUG_ADAPTER", "FirstAdapter实例:$firstAdapter SecondAdapter实例:$secondAdapter")
如果日志打印的实例中有null,直接调整对应Adapter的初始化时机即可解决问题。
内容的提问来源于stack exchange,提问作者Alok Jain
相关产品推荐
相关产品推荐

