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

自定义ListAdapter遇空指针:ListView初始化错误及数据更新问题

解决ListView.setAdapter()空指针异常问题

看了你的错误日志和代码,问题根源非常明确——你遇到的是空指针异常,核心原因是调用setAdapter时ListView还未完成初始化。

从错误日志的关键信息就能定位问题:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference

在你的MainActivity的onCreate方法里,执行顺序完全搞反了:你先创建适配器并调用listView.setAdapter,之后才调用findView()去初始化listView。而listView是在findView()里通过findViewById获取实例的,这就导致调用setAdapter时listView还是null,直接触发空指针崩溃。

解决方案:调整方法执行顺序

把findView()移到最前面(必须在setContentView之后),先完成所有控件的初始化,再处理适配器和列表绑定。修改后的onCreate代码如下:

private ListAdapter listAdapter;
private ArrayList<Model> models;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_income);
    // 第一步:先初始化所有控件(包括ListView)
    findView();
    // 第二步:初始化数据集合
    models = new ArrayList<>();
    // 可添加测试数据验证列表显示
    models.add(new Model("5000", "19", "07", "2024", "午餐补贴"));
    // 第三步:创建适配器并绑定到ListView
    listAdapter = new ListAdapter(models, this);
    listView.setAdapter(listAdapter);
    // 初始绑定数据时无需调用notifyDataSetChanged,适配器初始化已处理数据
    // listAdapter.notifyDataSetChanged();
    // 后续初始化工作
    initView();
    initListener();
}

额外注意事项

  • 动态刷新数据:后续通过models.add()添加新数据后,记得调用listAdapter.notifyDataSetChanged()通知列表刷新UI,示例:
    models.add(new Model("3000", "20", "07", "2024", "交通补助"));
    listAdapter.notifyDataSetChanged();
    
  • 验证控件ID匹配:检查activity_income.xml中ListView的ID确实是list_pemasukan,避免因ID不匹配导致findViewById返回null。

这样调整后,空指针问题就能解决,列表也能正常显示数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:21:56