繁体   English   中英

notifyItemChanged(int)不会更新RecyclerView.Adapter

[英]notifyItemChanged(int) does not update RecyclerView.Adapter

我正在开发消息传递应用程序。

通过MessageAdapter.java显示消息,该消息包含来自ChatActivity.javaHashMap ,具有以下属性:

 Map messageTextBody = new HashMap();
        messageTextBody.put("number", howManyMessages);
        messageTextBody.put("message", messageText);
        messageTextBody.put("type", "text"); //text, audio, image, video etc
        messageTextBody.put("from", messageSenderID);
        messageTextBody.put("time", saveCurrentTime);
        messageTextBody.put("date", saveCurrentDate);
        messageTextBody.put("read", hasUserRead);

发送到Messages.java

public class Messages {
private String from, message, type, time, date;
private Boolean read;
private Integer number;

public Messages(){

}

public Messages(String from, String message, String type, String time, String date, Boolean read, Integer number) {
    this.from = from;
    this.message = message;
    this.type = type;
    this.time = time;
    this.date = date;
    this.read = read;
    this.number = number;

}


public String getFrom() {
    return from;
}

public void setFrom(String from) {
    this.from = from;
}


public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}


public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}


public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}


public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}


public Boolean getRead() {
    return read;
}

public void setRead(Boolean read) {
    this.read = read;
}

public Integer getNumber() {
    return number;
}

public void setNumber(Integer number) {
    this.number = number;
}
}

然后在MessageAdapter.java访问:

public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>{
private List<Messages> userMessagesList;
private FirebaseAuth mAuth;
private DatabaseReference usersRef, messagesRef;
private Integer i;
private String messageSenderID;

public MessageAdapter (List<Messages> userMessagesList){
    this.userMessagesList = userMessagesList;
}

public class MessageViewHolder extends RecyclerView.ViewHolder{
   // public CircleImageView receiverProfileImage;
    public TextView nameReceived, senderMessageText, receiverMessageText, messageReceivedTime, messageSentTime, messageUnread;
    private String receivedTime, sentTime, lastReceivedTime, lastSentTime;
  //  private LoadingDots tinyDotsYou;


    public MessageViewHolder (@NonNull View itemView){
        super(itemView);

       // nameReceived = (TextView) itemView.findViewById(R.id.other_user_name);
        senderMessageText = (TextView) itemView.findViewById(R.id.message_sent);
        receiverMessageText = (TextView) itemView.findViewById(R.id.message_received);
        messageReceivedTime = (TextView) itemView.findViewById(R.id.message_received_time);
        messageSentTime = (TextView) itemView.findViewById(R.id.message_sent_time);
        messageUnread = (TextView) itemView.findViewById(R.id.unread_message_sent);

    }
}

@NonNull
@Override
public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.custom_messages_layout, viewGroup, false);

    mAuth = FirebaseAuth.getInstance();

    return new MessageViewHolder(view);

}


@Override
public void onBindViewHolder(@NonNull final MessageViewHolder messageViewHolder, int i) {

if (fromMessageType.equals("text")){
            messageViewHolder.receiverMessageText.setVisibility(View.INVISIBLE);
            messageViewHolder.senderMessageText.setVisibility(View.INVISIBLE);
            messageViewHolder.messageUnread.setVisibility(View.INVISIBLE);

            messageViewHolder.messageReceivedTime.setVisibility(View.INVISIBLE);
            messageViewHolder.messageSentTime.setVisibility(View.INVISIBLE);

            //messageViewHolder.receiverProfileImage.setVisibility(View.INVISIBLE);
            if (fromUserID.equals(messageSenderID)){ //MESSAGE SENT

              //  messageViewHolder.senderMessageText.setVisibility(View.VISIBLE);
                messageViewHolder.messageSentTime.setVisibility(View.VISIBLE);

                if (!messages.getRead()){

                    messageViewHolder.messageUnread.setText(messages.getMessage());
                    messageViewHolder.messageUnread.setVisibility(View.VISIBLE);
                    messageViewHolder.messageUnread.setBackgroundResource(R.drawable.chat_bubble_3);
                    messageViewHolder.messageSentTime.setText(messages.getTime().substring(0,5));

                }

                else {
                    messageViewHolder.senderMessageText.setText(messages.getMessage());
                    messageViewHolder.senderMessageText.setVisibility(View.VISIBLE);
                    messageViewHolder.senderMessageText.setBackgroundResource(R.drawable.chat_bubble_2);
                    messageViewHolder.messageSentTime.setText(messages.getTime().substring(0,5));

                }


            }

            else  { //MESSAGE RECEIVED

                //messageViewHolder.tinyDotsYou.setVisibility(View.VISIBLE);

                messageViewHolder.receiverMessageText.setVisibility(View.VISIBLE);
                messageViewHolder.messageReceivedTime.setVisibility(View.VISIBLE);


                messageViewHolder.receiverMessageText.setBackgroundResource(R.drawable.chat_bubble_1);
                messageViewHolder.receiverMessageText.setText(messages.getMessage());
                messageViewHolder.messageReceivedTime.setText(messages.getTime().substring(0,5));

            }

        }

    }

    @Override
    public int getItemCount() {
        return  userMessagesList.size();
    }

}

发送者发送新消息后,结构

if (!messages.getRead()){

                    messageViewHolder.messageUnread.setText(messages.getMessage());
                    messageViewHolder.messageUnread.setVisibility(View.VISIBLE);
                    messageViewHolder.messageUnread.setBackgroundResource(R.drawable.chat_bubble_3);
                    messageViewHolder.messageSentTime.setText(messages.getTime().substring(0,5));

                }

                else {
                    messageViewHolder.senderMessageText.setText(messages.getMessage());
                    messageViewHolder.senderMessageText.setVisibility(View.VISIBLE);
                    messageViewHolder.senderMessageText.setBackgroundResource(R.drawable.chat_bubble_2);
                    messageViewHolder.messageSentTime.setText(messages.getTime().substring(0,5));

                }

检查邮件是已读还是仍未读。

至于数据库,我正在使用Firebase数据库。

在此处输入图片说明

ValueEventListenerChatActivity.java警告我当“读”,从“假”到“真”的状态发生变化。

RootRef.child("Messages").child(messageReceiverID).child(messageSenderID).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            int i = 0;

                            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                                String uid = ds.getKey();

                                if (uid != null && isUserOnline.equals(true)){
                                    RootRef.child("Messages").child(messageReceiverID).child(messageSenderID).child(uid).child("read").setValue(true);
                                    RootRef.child("Messages").child(messageSenderID).child(messageReceiverID).child(uid).child("read").setValue(true);
                                    Map messageTextBody = new HashMap();
                                    messageTextBody.replace("read", true);
                                    messageAdapter.notifyItemChanged(i);

                                }
                                i++;
                            }
                        }

注意,它也替换了Map messageTextBody中的旧值,然后调用notifyItemChanged()

如果用户在线并且阅读了该消息,则聊天气泡显示为“橙色”,表示已看到该消息。

如果用户尚未阅读消息,则聊天气泡为灰色, 如图所示

当我离开然后返回ChatActivity时,它可以正常工作,它会强制更新整个RecyclerView。 但是我无法在ChatActivity的RecyclerView中获得从未更新为 读取的单个消息,以进行实时更新。

任何帮助将不胜感激。 提前致谢。

RootRef.child("Messages").child(messageReceiverID).child(messageSenderID).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange (@NonNull DataSnapshot dataSnapshot){


        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            String uid = ds.getKey();

            if (uid != null && isUserOnline.equals(true)) {
                RootRef.child("Messages").child(messageReceiverID).child(messageSenderID).child(uid).child("read").setValue(true);
                RootRef.child("Messages").child(messageSenderID).child(messageReceiverID).child(uid).child("read").setValue(true);
                Map messageTextBody = new HashMap();
                messageTextBody.replace("read", true);


            }

        }
       messageAdapter.notifyItemChanged(); // after end of loop using notifyItemChanged data
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM