我正在使用Firebase实时数据库构建聊天应用。我想实现像WhatsApp这样的功能,用户可以在没有互联网的情况下发送消息(在RecyclerView上添加消息对象)但是会有时钟图标(显示消息不是发送)。
当Firebase数据库收到消息(用户设备连接到互联网并且Firebase发送消息)时,我想更新recyclerview上添加的元素(更改时钟图标为积极的图标)。
我尝试了什么?我有那个
mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
mFirebaseAdapter = new ChatFirebaseAdapter(mFirebaseDatabaseReference.child("chat_id"), user.getId());
recyclerChat.setLayoutManager(mLinearLayoutManager);
recyclerChat.setAdapter(mFirebaseAdapter);
我的适配器从firebase-ui-database
我尝试在addChildEventListener
上添加DatabaseReference
,我获得了dataSnapshot
新元素,但我不知道如何在recyclerview上找到正确的位置
mFirebaseDatabaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
UPDATE RECYCLERVIEW ITEM
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我在添加新邮件时添加了onCompletionListener
,但我不知道如何再次获得正确的位置。
mFirebaseDatabaseReference.push().setValue(message, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError == null) {
UPDATE RECYCLERVIEW ITEM
}
}
});
有人知道我为什么不能做到这一点吗?谢谢。在被问到之前我经常搜索,但我找不到合适的答案。
答案 0 :(得分:3)
问题的解决方案在于添加一个已发布的布尔值,可以将其设置为 true ,一旦从onCompletionListener中的代码中获得成功的推送ID,那么所有人需要做的是将此布尔值设置为特定的推送ID。
现在在您的firebase ui中的Android客户端上,您可以检查此布尔值是否设置为true并相应地更改回收器视图项的状态。此解决方案将起作用,因为firebase数据库是实时的。
//设置布尔值onComplete
mFirebaseDatabaseReference.push().setValue(message, new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { if (databaseError == null) { databaseReference.child("delivered").setValue(true); } } });
对于whatsapp,messenger等聊天应用,如果不使用firebase作为备份,则会采用另一种消息传递路由。我不在这里讨论,因为它超出了提问范围。