更新客户端中的 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 作为支持,您将采用另一条消息传递途径。我不在这里讨论,因为它超出了问题的范围。