Android点击自定义适配器按钮报IllegalStateException系统服务不可用错误
问题根因
报错的核心原因是你在自定义适配器AccountsViewAdapter的getView方法中手动实例化了MainActivity:
mainActivity = new MainActivity();
Android 中的 Activity 必须由系统框架负责创建,才会走完全部生命周期流程、绑定所需的系统服务。你自行创建的 Activity 实例没有经过初始化流程,调用其方法时自然会抛出System services not available to Activities before onCreate()异常。
修复方案
按如下步骤修改AccountsViewAdapter代码即可解决问题:
- 删除
getView方法中mainActivity = new MainActivity();这行错误代码 - 在适配器构造方法中直接保存传入的上下文对应的 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
相关产品推荐
相关产品推荐

