更新客户端的recyclerview项ui,以指示服务器上的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扩展了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作为备份,您将采用另一条消息路由。我不在这里讨论,因为它超出了问题的范围。

相关内容

  • 没有找到相关文章

最新更新