首页 > 解决方案 > 我的适配器不会更新值,直到我返回然后再次返回该活动。什么原因

问题描述

我希望当用户看到消息时,它应该将文本从传递到看到。但这仅在我返回并再次参加该聊天活动时才会发生。我唯一的问题是当两个用户聊天都打开时如何将“已交付”更新为“已看到”。除此问题外,所有其他工作都很好。可能是适配器未通知。这是我看到消息的聊天活动代码:

private void seenMessage(){

    messageRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (final DataSnapshot snapshot:dataSnapshot.getChildren()){
                rootRef.child("Messages").child(friendUserId).child(currentUID).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
                        for (DataSnapshot snapshot1:dataSnapshot1.getChildren()){
                            ChatMessage chatMessage=snapshot1.getValue(ChatMessage.class);
                            if (chatMessage.getFrom().equals(friendUserId)){
                                HashMap seen=new HashMap();
                                seen.put("isseen",true);
                                snapshot.getRef().updateChildren(seen);
                                snapshot1.getRef().updateChildren(seen);
                                chatMessageAdapter.notifyDataSetChanged();
                            }
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
            }
            chatMessageAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

我的适配器代码在这里

  if (userMessageList.size()-1==i){
        if (message.isIsseen()){
            chatMessageViewHolder.seenStatus.setText("Seen");
        }
        else {
            chatMessageViewHolder.seenStatus.setText("Delivered");
        }
    }
    else {
        chatMessageViewHolder.seenStatus.setVisibility(View.GONE);
    }

标签: javaandroidfirebasefirebase-realtime-database

解决方案


替换addListenerForSingleValueEventaddValueEventListenerat your messageRef,因为第一个侦听器只触发一次以在该引用处侦听您的值,它只会通知您的适配器一次,相反,如果该引用有任何更改,第二个侦听器会继续侦听,您将在不离开活动的情况下实时查看更改,因为每当在该引用处进行更改时都会通知适配器。


推荐阅读