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
相关产品推荐
相关产品推荐

