Ash*_*dav 0 java android firebase firebase-realtime-database
好的,所以我想知道onChildRemovedFirebase Realtime Databse中的工作原理。用户添加数据后,即可以实时添加数据。但是当用户删除数据时,我想做同样的事情。如何进行呢?我阅读了文档,但无法获取。
任何帮助将不胜感激。
PS:我可以删除数据,mRootRef.child("message").removeValue();
但是我必须返回并再次参加此活动以查看更改。
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) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
@ mark922的答案具有要点,但您需要执行更多步骤。
当你从数据库中删除一个消息,你会得到一个DataSnapshot在删除消息onChildRemoved。您将需要:
messageList。mAdapter.notifyDataSetChanged()以使适配器重新绘制列表/回收器视图。棘手的是步骤1,因为这意味着您需要能够找到消息。最简单的方法是保留DataSnapshot.getKey()每个消息的。由于每个子节点的密钥必须唯一,因此每个密钥只能保证只有一条消息。
将其添加到当前代码的一种简单方法是添加一个keyList:
List<String> keyList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
然后在DataSnapshot添加值t时将每个键添加到该列表中messageList:
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Message message = dataSnapshot.getValue(Message.class);
messageList.add(message);
keyList.add(dataSnapshot.getKey());
mAdapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
现在,您有一个keyList和一个,messageList并且每个索引处的项目都彼此对应。因此,键keyList[0]对应于中的值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();
}
Run Code Online (Sandbox Code Playgroud)
仅当新消息始终附加在列表末尾时,以上代码才有效。在一个简单的聊天应用中,这可能是正确的。但是在更先进的应用程序中,您也可以在列表中的其他位置插入数据。
在这种情况下String s,传入的密钥onChildAdded变得很重要,因为它实际上是String previousChildKey:插入新子级之前的子级的键。为了正确处理此情况,您应该跟踪项目的顺序,例如,通过将键和值插入相应列表中的正确索引中。那时,您还需要处理onChildChanged和(对于这种情况更重要)onChildMoved。
所有这些都不是那么复杂,但是很容易出错。我建议看看FirebaseArrayFirebaseUI中的类作为示例/灵感来源。
| 归档时间: |
|
| 查看次数: |
481 次 |
| 最近记录: |