Android RecyclerView适配器赋值后无显示及空指针问题解决
问题分析与解决方案
先看你遇到的两个问题:之前的NullPointerException和现在RecyclerView无数据显示,根源都在JSON解析方法的逻辑错误,还有几处小的拼写问题,咱们一步步解决:
1. 核心问题:JSON解析方法完全写错了
你的jsonParse方法里犯了两个致命错误:
- 你新建了局部变量
list,但循环里却往未初始化的成员变量arrayList里加数据(这就是之前空指针的直接原因,因为arrayList一开始是null); - 最终返回的
list是空的,导致Adapter拿到的数据集为空,自然界面没内容。
修复后的jsonParse方法:
private ArrayList<News> jsonParse(String s) throws JSONException { ArrayList<News> list = new ArrayList<>(); JSONObject jsonObject = new JSONObject(s); JSONArray jsonArray = jsonObject.getJSONArray("articles"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject current = jsonArray.getJSONObject(i); String title = current.getString("title"); String description = current.getString("description"); String photo = current.getString("urlToImage"); // 注意这里的拼写错误:原代码是"urt",应该是"url" String more = current.getString("url"); News news = new News(title, description, photo, more); // 往局部变量list里添加数据,而不是成员变量arrayList list.add(news); } return list; }
2. 避免潜在空指针的优化
- Adapter的
getItemCount方法:添加null判断,防止后续如果数据集为空时再次触发空指针:
@Override public int getItemCount() { // 三元表达式处理null情况 return arrayList != null ? arrayList.size() : 0; }
- MainActivity里初始化数据集:在
onCreate开头先初始化arrayList,虽然修复解析方法后不是必须,但能让代码更健壮:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 提前初始化arrayList arrayList = new ArrayList<>(); recyclerView = findViewById(R.id.rv); // ... 后续代码不变 }
3. 其他需要注意的细节
- 网络请求的URL里的
&其实可以直接写成&,不过OkHttp会自动处理,这个不影响功能,但可读性更好; - 确保你的
item_row.xml布局里的title、description、image这几个ID和Adapter里findViewById的ID完全一致,避免找不到控件导致无内容; - 检查网络权限是否在Manifest里声明:
<uses-permission android:name="android.permission.INTERNET" />,没有的话网络请求会失败。
测试验证
修复完这些后,重新运行App:
- 网络请求成功后,JSON解析会正确生成包含数据的ArrayList;
- Adapter拿到有效的数据集,
getItemCount返回正确的数量; onBindViewHolder会正确绑定数据到每个Item,RecyclerView就能正常显示内容了。
内容的提问来源于stack exchange,提问作者Tanishq Saluja
相关产品推荐
相关产品推荐

