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

Android点击自定义适配器按钮报IllegalStateException系统服务不可用错误

问题根因

报错的核心原因是你在自定义适配器AccountsViewAdapter的getView方法中手动实例化了MainActivity:

mainActivity = new MainActivity();

Android 中的 Activity 必须由系统框架负责创建,才会走完全部生命周期流程、绑定所需的系统服务。你自行创建的 Activity 实例没有经过初始化流程,调用其方法时自然会抛出System services not available to Activities before onCreate()异常。

修复方案

按如下步骤修改AccountsViewAdapter代码即可解决问题:

  1. 删除getView方法中mainActivity = new MainActivity();这行错误代码
  2. 在适配器构造方法中直接保存传入的上下文对应的 MainActivity 实例:
public class AccountsViewAdapter extends ArrayAdapter<AccountsView> {
    // 原有成员变量保持不变
    MainActivity mainActivity;

    public AccountsViewAdapter(Context context, ArrayList<AccountsView> arrayList) {
        super(context, 0, arrayList);
        // 你从MainActivity传入的Context本身就是MainActivity实例,直接保存即可
        mainActivity = (MainActivity) context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        // 原有逻辑不变,仅删除手动new MainActivity的代码即可
        // 后续点击事件直接使用已保存的mainActivity实例调用方法
    }
}

可选优化

你当前每次更新列表都重新创建适配器、重新绑定到ListView的写法性能较差,可优化为仅更新适配器数据:

// 把适配器改为MainActivity的成员变量
AccountsViewAdapter ledgerAdapter;

public void updateList() {
    fileWorker.sortAccounts(directory);
    ledgerList = fileWorker.getAccountsList(directory);
    if (ledgerAdapter == null) {
        // 首次初始化时才创建适配器
        ledgerAdapter = new AccountsViewAdapter(this, ledgerList);
        ledgerListView.setAdapter(ledgerAdapter);
    } else {
        // 后续数据更新直接刷新适配器即可
        ledgerAdapter.clear();
        ledgerAdapter.addAll(ledgerList);
        ledgerAdapter.notifyDataSetChanged();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:36:03