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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:19:22