You need to enable JavaScript to run this app. Android自定义好友请求Adapter调用setOnClickListener空对象引用异常
优惠活动
大模型
产品
解决方案
定价
更多

Android自定义好友请求Adapter调用setOnClickListener空对象引用异常

崩溃根因定位
  • 核心问题为布局文件引用不匹配导致的控件空实例:
    1. Adapter构造方法中向父类ArrayAdapter传入的布局参数为R.layout.friends_requests_item
    2. 在getView方法初始化ViewHolder的逻辑分支中,实际通过LayoutInflater加载的布局却是R.layout.friends_item
    3. 你当前提供的含ibAdd、ibDel、uImgreqs控件的布局文件,和代码实际加载的friends_item不是同一个文件
  • 当代码执行convertView.findViewById(R.id.ibAdd)时,因为加载的目标布局里根本没有这个id的控件,方法直接返回null并赋值给viewHolder.add,后续调用viewHolder.add.setOnClickListener()时就会触发空指针异常
  • 之所以同款逻辑的其他代码运行正常,是因为其他实现里inflate加载的布局、和控件id所在的布局文件完全匹配,不存在引用错配的问题
快速修复方案
  • 把getView方法里的inflate逻辑修改为和实际控件所在的布局对应,即把代码:
    convertView = inflater.inflate(R.layout.friends_item, parent, false);
    
    替换为:
    convertView = inflater.inflate(R.layout.friends_requests_item, parent, false);
    
  • 确认你贴出的含ibAdd/ibDel/tvDescr控件的布局文件,文件名就是friends_requests_item.xml,避免出现多个同名不同内容的布局文件导致的引用错乱
  • 补充校验:在执行完所有findViewById赋值ViewHolder字段后,可以加一行临时日志打印每个控件的实例是否为null,快速定位id是否匹配
代码优化提示
  • 当前代码在每个列表项的绑定逻辑里都重复调用FirebaseAuth.getInstance().getCurrentUser()获取当前用户uid,可以提前在Adapter初始化时一次性获取存为成员变量,减少重复调用
  • 代码中绑定的Firebase数据库监听没有做生命周期解绑,页面销毁时如果监听还在回调,容易引发内存泄漏,但这个问题不会导致当前的崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 22:36:01