RecycleView加载Firebase数据点击条目弹框展示用户数据报空值如何解决
空值报错原因排查及修复方案
核心报错原因
- 你当前的执行顺序完全颠倒:
dname、dmail等详情文本控件属于弹框的doctor_info布局,你在onItemClick中先调用控件的setText方法,之后才调用showdialog()加载弹框布局、绑定控件,此时文本控件还未完成初始化,必然是空对象,调用setText就会触发空指针异常。 - 其它可能的空值风险:
doctors集合未完成Firebase异步加载就被点击访问,或者对应position的条目为null- 全局
dialog对象未提前初始化就调用setContentView等方法
修复方案
调整逻辑顺序
把控件的初始化、赋值逻辑全部放到弹框布局加载完成之后执行,点击时把选中的position传递给弹框方法即可,参考修正代码:
@Override public void onItemClick(int position) { // 先判断集合和对应条目非空,避免空指针 if(doctors == null || position <0 || position >= doctors.size() || doctors.get(position) == null){ return; } // 把position传给弹框方法 showdialog(position); } public void showdialog(int position){ // 先初始化dialog,全局dialog建议每次重新创建避免复用问题 if(dialog == null){ dialog = new Dialog(YourActivity.this); } // 先加载弹框布局 dialog.setContentView(R.layout.doctor_info); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); // 布局加载完成后再绑定所有文本控件 TextView exist=dialog.findViewById(R.id.exist); TextView dname=dialog.findViewById(R.id.你的dname对应控件id); TextView dmail=dialog.findViewById(R.id.你的dmail对应控件id); TextView daddress=dialog.findViewById(R.id.你的daddress对应控件id); TextView dgender=dialog.findViewById(R.id.你的dgender对应控件id); TextView dphone=dialog.findViewById(R.id.你的dphone对应控件id); // 绑定完控件再赋值 DoctorBean doctor = doctors.get(position); dname.setText(doctor.getName()); dmail.setText(doctor.getMail()); daddress.setText(doctor.getAddress()); dgender.setText(doctor.getGender()); dphone.setText(doctor.getPhone()); exist.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); // 最后再显示弹框 dialog.show(); }
额外注意事项
- Firebase拉取数据是异步操作,需要在数据加载完成、刷新完RecyclerView适配器之后再允许用户点击条目,避免点击时
doctors集合还为空。 - 不要把弹框的文本控件声明为全局变量,每次加载弹框布局时在方法内局部绑定即可,避免布局复用导致的控件缓存问题。
内容的提问来源于stack exchange,提问作者YeHya Ahmed
相关产品推荐
相关产品推荐

