Android开发:使用ListAdapter填充ListView触发NullPointerException
解决Fragment中设置ListAdapter时的NullPointerException问题
先帮你梳理下核心问题:在list.setAdapter(adapter)这一行抛出空指针异常,本质是list对象为null——也就是你没能正确找到布局里的ListView控件。结合你的代码和布局文件,我找到了两个直接问题,还有一个隐藏的风险点:
问题1:控件ID完全不匹配
你在代码里查找ListView用的是:
list = (ListView) getActivity().findViewById(R.id.list);
但你的布局文件里,ListView的ID是@+id/dispensaryMenuList,两者完全对应不上,这肯定找不到控件,导致list为null。
问题2:Fragment获取控件的方式错误
在Fragment的onViewCreated方法里,必须用方法参数传入的view对象来查找控件,而不是getActivity()。因为getActivity()是去查找Activity布局里的控件,而Fragment自己的布局是绑定在onViewCreated传入的view实例上的,用getActivity()根本找不到Fragment布局里的控件。
隐藏风险:JSON数据的空指针隐患
你的代码里还有个潜在问题:如果没有找到匹配MainActivity.ID的dispensary,jsonObject2会是null,这时调用jsonObject2.optJSONArray("dispensary_products")会直接抛NPE;就算jsonObject2存在,jsonArray2也可能为null,后续循环jsonArray2.length()同样会出错,必须加非空判断。
修改后的完整代码
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 修正:用view查找Fragment布局里的ListView,使用正确的ID list = view.findViewById(R.id.dispensaryMenuList); JSONObject jsonObject1 = null; JSONObject jsonObject2 = null; JSONArray jsonArray1 = null; JSONArray jsonArray2 = null; try { jsonObject1 = new JSONObject(MainActivity.dispensaries); jsonArray1 = jsonObject1.optJSONArray("dispensaries"); // 加非空判断,避免jsonArray1为null时循环出错 if(jsonArray1 != null) { for(int i = 0 ; i<jsonArray1.length() ; i++) { try { JSONObject object = jsonArray1.getJSONObject(i); if(MainActivity.ID.equals(object.get("dispensary_id"))) { jsonObject2 = object; break; // 找到匹配项后直接跳出循环,提升效率 } } catch (JSONException e) { e.printStackTrace(); } } } // 加非空判断,避免jsonObject2为null时调用optJSONArray if(jsonObject2 != null) { jsonArray2 = jsonObject2.optJSONArray("dispensary_products"); Log.e(TAG , "jsonArray = " + jsonArray2); } } catch(JSONException e) { e.printStackTrace(); } // 加非空判断,避免jsonArray2为null时循环出错 if(jsonArray2 != null) { for(int i = 0 ; i<jsonArray2.length() ; i++) { try { JSONObject object = jsonArray2.getJSONObject(i); if(object.has("product_id")) { names.add(object); } } catch (JSONException e) { e.printStackTrace(); } } } Log.e(TAG , "list = " + names); adapter = new DispensaryMenuAdapter(getContext(), names); // 最后再加一层判断,确保list不为null再设置适配器 if(list != null) { list.setAdapter(adapter); } }
关键修改点总结
- 用
view.findViewById(R.id.dispensaryMenuList)替代getActivity().findViewById(R.id.list),确保能正确找到Fragment布局内的ListView - 给所有JSON相关对象添加非空判断,避免数据异常时触发空指针
- 找到匹配的dispensary后添加
break,减少不必要的循环消耗
内容的提问来源于stack exchange,提问作者Andrei Nechita
相关产品推荐
相关产品推荐

