Android开发:Fragment中ListView点击调用Adapter.getItem报空对象错误
空指针报错根因
报错Attempt to invoke virtual method 'java.lang.Object com.example.securityaplication.ItemArrayAdapter.getItem(int)' on a null object reference的核心触发原因是变量作用域赋值错位,和你提到的Fragment运行环境、getContext()调用方式没有任何关联:
- 类中定义的全局成员变量
ItemArrayAdapter adapter全程没有被赋值,始终保持Java默认的null状态 - 初始化列表时创建的
itemArrayAdapter是onCreateView方法内的局部变量,仅被设置给ListView的Adapter属性,没有同步赋值给全局的adapter成员 - 条目点击回调中调用
adapter.getItem(position)时,自然会触发空对象调用错误。
你之前在其他Activity项目中能正常运行,本质是那个项目里的adapter是被正确初始化赋值的,和代码写在Activity还是Fragment里没有直接关系。
具体修复操作
- 修正Adapter初始化逻辑,不再创建无意义的局部变量,直接给全局
adapter成员赋值:
原有错误代码段:
替换为正确逻辑:ArrayList<ItemList> ItemList = new ArrayList<>(); ItemArrayAdapter itemArrayAdapter = new ItemArrayAdapter(getActivity(), R.layout.adapter_view_layout,ItemList); listax.setAdapter(itemArrayAdapter);ArrayList<ItemList> itemList = new ArrayList<>(); // 直接给全局声明的adapter变量赋值 adapter = new ItemArrayAdapter(getActivity(), R.layout.adapter_view_layout, itemList); listax.setAdapter(adapter); - 上下文使用说明:Fragment中调用
getContext()作为Toast的上下文完全合法,只要Fragment处于已附加到宿主Activity的状态,该方法就不会返回null,不需要强制替换为其他上下文获取方式。 - PopupMenu调用优化:完成空指针修复后,可直接解开条目点击回调中的
showPopup注释,将回调参数里的被点击条目的view实例传入方法作为菜单锚点,即可实现点击对应条目弹出菜单的效果:listax.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { ItemList item = adapter.getItem(position); Toast.makeText(getContext(), item.getTxtNomeItem().toString(), Toast.LENGTH_SHORT).show(); // 传入当前点击的条目View作为PopupMenu锚点 showPopup(view); } }); - 额外小修正:当前
onMenuItemClick回调里,itemEmprestar和itemRecuperar分支的Toast文案重复写的是“Item 3 clicked”,可以顺手修正成对应分支的提示内容,避免逻辑展示错误。
内容的提问来源于stack exchange,提问作者reisen
相关产品推荐
相关产品推荐

