好的,所以我想知道 onChildRemoved
是如何实现的在 Firebase 实时数据库中工作。用户添加数据后,我就可以添加数据,即实时添加。但我想当用户删除数据时做同样的事情。如何继续呢?我阅读了文档但无法获取它。
任何帮助将不胜感激。
PS:我可以通过 mRootRef.child("message").removeValue();
删除数据但我必须回去再次参加这个 Activity 才能看到变化。
private void loadmessage(String class_id, String email_red) {
messageQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Message message = dataSnapshot.getValue(Message.class);
messageList.add(message);
mAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
//what to add here??
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
最佳答案
@mark922 的答案有要点,但您还需要执行一些步骤。
当您从数据库中删除消息时,您将在 onChildRemoved
中获得该已删除消息的 DataSnapshot
。您将需要:
- 在
messageList
中查找相应的消息。 - 从列表中删除该消息。
- 调用
mAdapter.notifyDataSetChanged()
使适配器重新绘制列表/回收器 View 。
棘手的地方是第 1 步,因为这意味着您需要能够找到该消息。最简单的方法是保留每条消息的 DataSnapshot.getKey()
。由于每个子节点的键必须是唯一的,因此保证每个键只有一条消息。
将其添加到当前代码的一个简单方法是添加一个keyList
:
List<String> keyList = new ArrayList<String>();
然后在添加值 t messageList
时将每个 DataSnapshot
的键添加到该列表:
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Message message = dataSnapshot.getValue(Message.class);
messageList.add(message);
keyList.add(dataSnapshot.getKey());
mAdapter.notifyDataSetChanged();
}
现在您有了一个 keyList
和一个 messageList
,并且每个索引处的项目彼此对应。所以keyList[0]
中的key对应messageList[0]
中的值,等等
这意味着在 onChildRemoved
中,您可以查找在 keyList
中删除的消息的索引,然后从 messageList
中删除该消息> 和 keyList
基于索引:
public void onChildRemoved(DataSnapshot dataSnapshot) {
int index = keyList.indexOf(dataSnapshot.getKey());
messageList.remove(index);
keyList.remove(index);
mAdapter.notifyDataSetChanged();
}
关于消息插入的注释
仅当新消息始终附加到列表末尾时,上述代码才有效。在一个简单的聊天应用程序中这可能是正确的。但在更先进的应用程序中,您也可以将数据插入列表中的其他位置。
在这种情况下,传递给 onChildAdded
的 String s
就变得很重要,因为它实际上是 String previousChildKey
:子项的键在此之前插入新的子项。为了正确处理这种情况,您应该跟踪项目的顺序,例如通过将键和值插入到各自列表的正确索引中。此时,您还需要处理 onChildChanged
和(对于此场景更重要)onChildMoved
。
所有这些并不是非常复杂,但是很容易出错。我建议看看 FirebaseArray
class from FirebaseUI作为示例/灵感来源。
关于java - 如何在Firebase实时数据库中使用onChildRemoved?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52018612/