Android自定义好友请求Adapter调用setOnClickListener空对象引用异常
崩溃根因定位
- 核心问题为布局文件引用不匹配导致的控件空实例:
- Adapter构造方法中向父类ArrayAdapter传入的布局参数为
R.layout.friends_requests_item - 在
getView方法初始化ViewHolder的逻辑分支中,实际通过LayoutInflater加载的布局却是R.layout.friends_item - 你当前提供的含
ibAdd、ibDel、uImgreqs控件的布局文件,和代码实际加载的friends_item不是同一个文件
- Adapter构造方法中向父类ArrayAdapter传入的布局参数为
- 当代码执行
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
相关产品推荐
相关产品推荐

