Android:使用FirebaseUI从Firebase实时数据库子节点读取数据至RecyclerView
解决FirebaseUI加载嵌套节点数据到RecyclerView的问题
我来帮你搞定这个问题!从你的代码和描述来看,核心问题是数据库里的Name等字段嵌套在info子节点下,目前你的User类没有对应这种嵌套结构,不过你已经尝试在SnapshotParser里手动解析了,这里给你两种更稳妥的解决方案:
方案一:调整User类实现自动映射
Firebase支持自动将数据库节点映射到POJO类,只要类结构和数据库节点结构对应就行。我们可以给User类添加一个内部类来对应info子节点,这样就不用手动解析了:
public class User { private Info info; // Firebase要求必须有无参构造函数 public User() {} public Info getInfo() { return info; } public void setInfo(Info info) { this.info = info; } // 内部类对应数据库中的info节点 public static class Info { // 注意字段名要和数据库节点名一致(包括大小写),如果不一致可以用@PropertyName注解 private String Name; private String State; private String Image; public Info() {} public String getName() { return Name; } public String getState() { return State; } public String getImage() { return Image; } } }
之后你可以简化FirebaseRecyclerOptions的配置,去掉手动的SnapshotParser:
FirebaseRecyclerOptions<User> options = new FirebaseRecyclerOptions.Builder<User>() .setQuery(query, User.class) .build();
最后在onBindViewHolder中调整调用方式,从info对象里获取字段:
@Override protected void onBindViewHolder(@NonNull Users_ViewHolder holder, int position, @NonNull User model) { holder.Set_Name(model.getInfo().getName()); holder.Set_Image(model.getInfo().getImage()); holder.Set_State(model.getInfo().getState()); }
方案二:优化手动解析逻辑
如果你想保持现有的User类结构,可以优化手动解析的代码,重点是处理空值避免崩溃:
FirebaseRecyclerOptions<User> options = new FirebaseRecyclerOptions.Builder<User>() .setQuery(query, new SnapshotParser<User>() { @NonNull @Override public User parseSnapshot(@NonNull DataSnapshot snapshot) { // 直接用getValue(String.class)获取值,避免toString()导致空指针 String name = snapshot.child(App_Constants.INFO_COLUMN).child(App_Constants.NAME_COLUMN).getValue(String.class); String state = snapshot.child(App_Constants.INFO_COLUMN).child(App_Constants.STATE_COLUMN).getValue(String.class); String image = snapshot.child(App_Constants.INFO_COLUMN).child(App_Constants.IMAGE_COLUMN).getValue(String.class); // 给空值设置默认值,防止UI显示异常或崩溃 name = name != null ? name : "Unknown User"; state = state != null ? state : "No State"; image = image != null ? image : ""; return new User(name, state, image); } }).build();
关键注意事项
- Firebase的POJO映射必须要有无参构造函数,否则无法实例化对象
- 字段名要和数据库节点名严格对应(包括大小写),如果需要不同的字段名,可以在getter方法上添加
@PropertyName("节点名")注解 - 手动解析时一定要处理空值,避免某个节点不存在时出现
NullPointerException
内容的提问来源于stack exchange,提问作者mohamed ebraheem
相关产品推荐
相关产品推荐

