notifyItemChanged(int)不更新RecyclerView.Adapter

时间:2019-01-16 19:56:28

标签: java android firebase

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

消息通过MessageAdapter.java显示,其中包含HashMap中的ChatActivity.java,具有以下属性:

 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数据库。

enter image description here

当“读取”的状态从“假”变为“真”时,来自ValueEventListener的{​​{1}}会警告我。

ChatActivity.java

请注意,它还会替换Map messageTextBody中的旧值,然后调用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++; } }

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

如果用户尚未阅读消息,则聊天气泡为灰色,as the picture depicts

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

任何帮助将不胜感激。预先感谢。

1 个答案:

答案 0 :(得分:0)

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
    }
}