我正在使用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
扩展了FirebaseRecyclerAdapter
我试图在我的DatabaseReference
上添加addChildEventListener
,在那里我得到了新元素的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
}
}
});
有人知道为什么我做不到吗?谢谢。
你的问题的解决方案在于添加一个交付布尔值,它可以设置为true,一旦你从onCompletionListener的代码中收到成功的推送id,那么你所需要做的就是将这个布尔值设置为特定的推送id。
现在,在您的android客户端firebase ui中,您可以检查该布尔值是否设置为true,并相应地更改回收器视图项的状态。这个解决方案可以工作,因为firebase数据库是实时的。
//设置boolean 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作为备份,您将采用另一条消息路由。我不在这里讨论,因为它超出了问题的范围。