更新客户端中的 recyclerview 项目 ui 以指示服务器上的 Firebase 数据库已更新
Update recyclerview item ui in client to indicate that Firebase Database on server got updated
我正在使用 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
}
}
});
有人知道我为什么做不到吗?谢谢。我在问之前搜索了很多,但我没有找到正确的答案。
您的问题的解决方案在于添加一个 delivered 布尔值,它可以设置为 true 并且一旦您从你的代码在 onCompletionListener 中,那么你需要做的就是将这个布尔值设置为那个特定的推送 ID。
现在在你的 android 客户端上你的 firebase ui 你可以检查这个布尔值是否设置为 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 作为支持,您将采用另一条消息传递途径。我不在这里讨论,因为它超出了问题的范围。
我正在使用 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
我试图在我的 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
}
}
});
有人知道我为什么做不到吗?谢谢。我在问之前搜索了很多,但我没有找到正确的答案。
您的问题的解决方案在于添加一个 delivered 布尔值,它可以设置为 true 并且一旦您从你的代码在 onCompletionListener 中,那么你需要做的就是将这个布尔值设置为那个特定的推送 ID。
现在在你的 android 客户端上你的 firebase ui 你可以检查这个布尔值是否设置为 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 作为支持,您将采用另一条消息传递途径。我不在这里讨论,因为它超出了问题的范围。