更新客户端中的recyclerview项目ui,以指示服务器上的Firebase数据库已更新

时间:2016-09-27 14:34:27

标签: android firebase android-recyclerview firebase-realtime-database firebaseui

我正在使用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

我尝试在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
            }
        }
    });

有人知道我为什么不能做到这一点吗?谢谢。在被问到之前我经常搜索,但我找不到合适的答案。

1 个答案:

答案 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作为备份,则会采用另一种消息传递路由。我不在这里讨论,因为它超出了提问范围。