[英]notifyItemChanged(int) does not update RecyclerView.Adapter
我正在开发消息传递应用程序。
通过MessageAdapter.java
显示消息,该消息包含来自ChatActivity.java
的HashMap
,具有以下属性:
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数据库。
和ValueEventListener
从ChatActivity.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.