You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView多类型列表构建问题:如何创建SectionOrRow数据列表

解决RecyclerView适配器中SectionOrRow列表构建的空指针问题

首先,咱们先搞清楚你遇到的NullPointerException为啥会出现:
你在适配器构造方法里只是调用了SectionOrRow.createRow()和createSection(),但根本没把这些创建出来的对象添加到列表里,而且如果调用适配器时传入的data是null,那mData就会直接变成null,当getItemCount()调用mData.size()时自然就炸了。

下面给你两种正确的列表构建方式,优先推荐第一种:

1. 在适配器外部构建数据列表(推荐,符合单一职责原则)

适配器的核心职责是把数据绑定到UI上,数据的创建和组装应该放在外部(比如你的Activity、Fragment或者专门的数据处理类里),这样代码更清晰,也方便后续修改和维护数据。

举个例子,在你的Activity里:

// 1. 初始化列表,确保不会为null
List<SectionOrRow> dataList = new ArrayList<>();
// 2. 按需求添加Section和Row对象
dataList.add(SectionOrRow.createSection("section 1"));
dataList.add(SectionOrRow.createRow("row 1"));
dataList.add(SectionOrRow.createRow("row 2"));
dataList.add(SectionOrRow.createSection("section 2"));
dataList.add(SectionOrRow.createRow("row 3"));
// 3. 把组装好的列表传给适配器
MyRecycler adapter = new MyRecycler(dataList);
// 最后绑定到RecyclerView
recyclerView.setAdapter(adapter);

然后你的适配器构造方法保持简洁,同时加个判空避免外部传入null:

public MyRecycler(List<SectionOrRow> data) {
    mData = data != null ? data : new ArrayList<>();
}

2. 若需在适配器内部构建列表(不推荐,但可实现)

如果确实要在适配器里创建数据,那你需要自己初始化列表并将创建的元素添加进去,而不是依赖外部传入的data:

public MyRecycler(List<SectionOrRow> data) {
    // 初始化mData为新列表,避免null问题
    mData = new ArrayList<>();
    // 添加Section和Row对象到mData中
    mData.add(SectionOrRow.createSection("section 1"));
    mData.add(SectionOrRow.createRow("row 1"));
    // 如果需要保留外部传入的data内容,可以追加:
    // if (data != null) mData.addAll(data);
}

额外的安全保障

为了避免后续再出现类似的空指针,建议在getItemCount()里加个判空处理:

@Override
public int getItemCount() {
    return mData != null ? mData.size() : 0;
}

这样哪怕mData意外为null,也不会直接崩溃,而是返回0,RecyclerView会显示空布局(如果你配置了的话)。

内容的提问来源于stack exchange,提问作者Talisman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:40