Android中Firebase实时数据库变更无法同步至界面问题
解决你的购物清单APP实时更新问题
嘿,我仔细看了你的代码,发现了导致界面无法同步更新的核心问题,咱们一步步来修复:
1. 数据库路径不匹配是元凶!
你在监听数据的查询路径和写入数据的路径根本不是同一个节点:
- 在
onCreateView里,你让FirebaseRecyclerAdapter监听的是users/{uid}/shopping节点:Query query = mDatabase.child("users").child(uid).child("shopping"); - 但在
addNewCheckBox方法里,你把新的购物项写到了users/{uid}/shopping_list节点:
适配器盯着的节点根本没收到新数据,当然不会更新界面啦!mDatabase.child("users").child(getUid()).child("shopping_list").child(key).setValue(item);
2. 多余的notifyDataSetChanged()调用
FirebaseRecyclerAdapter本身就自带实时监听功能,只要数据在它监听的节点里发生变化,它会自动刷新RecyclerView,你手动调用notifyDataSetChanged()完全没必要,而且因为路径不对,这行代码根本起不了作用。
具体修复步骤
第一步:统一数据库节点路径
把查询路径改成和写入路径一致的shopping_list:
// 修改onCreateView中的查询代码 Query query = mDatabase.child("users").child(uid).child("shopping_list");
第二步:简化addNewCheckBox方法
删掉那行没用的notifyDataSetChanged(),让Firebase自己处理更新:
public void addNewCheckBox(ViewGroup container) { String key = mDatabase.child("users").child(getUid()).child("shopping_list").push().getKey(); ShoppingListItem item = new ShoppingListItem("test"); mDatabase.child("users").child(getUid()).child("shopping_list").child(key).setValue(item); // 移除这行:firebaseRecyclerAdapter.notifyDataSetChanged(); }
第三步:优化适配器启动顺序(可选但推荐)
把设置适配器和启动监听的顺序调整一下,先绑定适配器再启动监听,更符合FirebaseRecyclerAdapter的最佳实践:
@Override public void onStart() { super.onStart(); rv.setAdapter(firebaseRecyclerAdapter); firebaseRecyclerAdapter.startListening(); }
额外小建议
- 可以把数据库节点名称定义成常量,比如
private static final String SHOPPING_LIST_NODE = "shopping_list";,之后所有用到这个节点的地方都用常量,避免手动拼写出错。 - 保留
ShoppingListItem的无参构造函数,这是Firebase序列化数据必须的,你现在的代码已经做到了,很好。
改完这些之后,你再点击添加按钮,数据会正确写入适配器监听的节点,Firebase会自动触发RecyclerView的更新,界面就能同步显示新的购物项啦!
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

