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

无法用字符串数组填充ListView Fragment,求故障排查与解决方法

问题分析与解决

崩溃核心原因

你遇到的Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference错误,根源是字符串数组itemArray中存在大量null元素——当ArrayAdapter遍历数组渲染列表项时,会对每个元素调用toString(),遇到null就触发空指针异常。

看代码就能定位问题:

int j = 0;
String itemArray[ ] = new String[size];
// ...
for(ItemClass i : items){
    itemArray[j] = i.getTitle();
    // 这里缺少j++的操作!
}

循环中始终只给itemArray[0]赋值,后续所有数组位置都是null,这是导致崩溃的直接原因。

另外还有两个潜在问题:

  1. ArrayAdapter布局参数错误:你传入的R.layout.activity_listview是整个ListView所在的布局文件,而不是单个列表项的布局。ArrayAdapter需要的是单个item的布局(比如系统自带的android.R.layout.simple_list_item_1,或自定义的仅含TextView的布局)。
  2. 空指针防护缺失:直接调用mainActivity.alist和items.size()前未判空,若mainActivity为null或alist为空,会提前触发崩溃。

修正后的完整代码

public class ListviewFragment extends Fragment implements AdapterView.OnItemClickListener, View.OnClickListener {
    private LinkedList<ItemClass> linkedList;
    private ListView listView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.frag_listviewfragment, container, false);
        
        // 增加宿主Activity判空
        if (!(getActivity() instanceof MainActivity)) {
            Log.e("MyTag", "当前宿主不是MainActivity");
            return v;
        }
        MainActivity mainActivity = (MainActivity) getActivity();
        LinkedList<ItemClass> items = mainActivity.alist;

        // 增加数据源判空
        if (items == null || items.isEmpty()) {
            Log.d("UI thread", "列表为空");
            return v;
        }

        int size = items.size();
        String itemArray[] = new String[size];
        int j = 0;
        for(ItemClass i : items){
            Log.d("UI thread", "当前item描述: " + i.getdescription());
            itemArray[j] = i.getTitle();
            Log.d("UI thread", "添加到数组的内容: " + i.getTitle());
            j++; // 必须递增索引,确保每个数组位置都被赋值
        }

        // 使用系统默认的列表项布局,也可替换为你自定义的单个item布局
        ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, itemArray);
        if (adapter == null) {
            Log.e("MyTag","Adapter初始化失败");
            return v;
        }

        listView = v.findViewById(R.id.list);
        if(listView == null){
            Log.e("MyTag","ListView未找到");
            return v;
        }

        listView.setAdapter(adapter);
        listView.setOnItemClickListener(this); // 直接在这里设置点击监听

        return v;
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void onClick(View view) {}

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {}
}

关键修正点

  • 给循环中的索引j添加j++,确保数组每个位置都被正确赋值。
  • 替换ArrayAdapter的布局参数为单个列表项的布局(如android.R.layout.simple_list_item_1)。
  • 增加多处空指针判断,避免因宿主Activity、数据源为空导致的崩溃。
  • 将ListView的点击监听移到onCreateView中,确保ListView初始化完成后再设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:34:58