FirebaseRecyclerAdapter加载comment模型返回null值如何排查解决?
问题修复方案
1. 修正RecyclerView查询路径(核心错误)
当前CommentFragment中查询的是comments根节点,而你需要查询的是对应帖子下的评论子节点,路径不匹配导致Firebase无法正确映射数据到实体类。
修复initRecyclerView中的query代码:
// 错误写法 // query = FirebaseDatabase.getInstance().getReference().child("comments").orderByValue(); // 正确写法,查询当前帖子对应的评论节点 query = FirebaseDatabase.getInstance().getReference() .child("comments") .child(value) .orderByKey(); // 你用时间戳作为key,按key排序即可实现按时间排序
2. 修正comment实体类的JavaBean规范(核心错误)
Firebase通过反射匹配getter/setter和字段名赋值,你当前的实体类不符合规范,导致反射取值失败:
setComment()方法缺少入参,完全无效- getter命名不符合驼峰规则,无法匹配对应字段
修复后的实体类代码:
// 建议类名首字母大写,符合Java规范 public class Comment { public String uID; public String comment_t; public long unixTimestamp; public Comment() { // 必须保留空构造方法 } public Comment(String uID, String comment_t, long unixTimestamp) { this.uID = uID; this.comment_t = comment_t; this.unixTimestamp = unixTimestamp; } // 修正getter命名符合驼峰规范 public String getUID() { return uID; } public void setUID(String uID) { this.uID = uID; } public String getComment_t() { return comment_t; } // 补全setter的入参 public void setComment_t(String comment_t) { this.comment_t = comment_t; } public long getUnixTimestamp() { return unixTimestamp; } public void setUnixTimestamp(long unixTimestamp) { this.unixTimestamp = unixTimestamp; } }
注:如果你的数据库字段名和实体类字段名不一致,可以给字段加@PropertyName("数据库字段名")注解强制匹配
实体类修改后,适配器中取评论内容的代码也要对应修改:
// 错误写法 // String com = model.getComment(); // 正确写法 String com = model.getComment_t();
3. 修正评论提交逻辑的空判断错误
当前判断评论为空的写法comment_text.getText().toString() == NULL存在两处错误:
- Java中空常量是小写
null,大写NULL会编译报错 - 字符串内容比较不能用
==,应该用TextUtils.isEmpty()
修复代码:
comment_post.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String input = comment_text.getText().toString().trim(); if(TextUtils.isEmpty(input)){ Toast.makeText(getActivity(), "No Comment Typed", Toast.LENGTH_LONG).show(); return; } // 建议直接用带参构造方法创建对象,更安全 Comment com = new Comment(user.getUid(), input, globalUnix); mDatabase.child("comments").child(value).child(String.valueOf(globalUnix)).setValue(com); // 提交后清空输入框 comment_text.setText(""); } });
4. 其他可选优化
- 适配器中无需重复初始化
mDatabase,全局初始化一次即可 - 时间转换逻辑可以放到实体类中作为工具方法,简化适配器代码
- 列表滚动时Glide加载图片可以添加占位图和错误图,提升体验
内容的提问来源于stack exchange,提问作者R. Row
相关产品推荐
相关产品推荐

