问题
I want to show if a message is seen or not in my app which is using Firebase Real time Database.What i am able to till now is update it on on the database if the message is seen or not but i am not able to retrieve that value using listeners in my recyclerview Adaptor .It happens that if the last message is not seen it displays all the previous messages are not seen similarly if the last message is seen it displays all the previous messages are seen.
Database Structure
My Code for checking if the message is seen or not
@Override
public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {
Chat chat=mChat.get(position);
holder.show_message.setText(chat.getMessage());
if (Key != null) {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Chats").child(ChatKey).child(Key);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Chat chat1 = dataSnapshot.getValue(Chat.class);
if (chat1.isIsseen()) {
holder.Delivered.setImageResource(R.drawable.ic_done_all_black_24dp);
} else {
holder.Delivered.setImageResource(R.drawable.ic_check_black_24dp);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
databaseReference.addValueEventListener(eventListener);
}
if (imageurl.equals("default")){
holder.profile_image.setImageResource(R.drawable.user2);
} else {
Glide.with(mContext).load(imageurl).into(holder.profile_image);
}
}
Update
Chat Class
public class Chat {
private String sender;
private String receiver;
private String message;
private boolean isseen;
private long timestamp;
String MessageId;
public Chat(String sender, String receiver, String message, boolean isseen, long timestamp) {
this.sender = sender;
this.receiver = receiver;
this.message = message;
this.isseen = isseen;
this.timestamp = timestamp;
}
public Chat() {
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessageId() {
return MessageId;
}
public void setMessageId(String messageId) {
MessageId = messageId;
}
public boolean isIsseen() {
return isseen;
}
public void setIsseen(boolean isseen) {
this.isseen = isseen;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}
Update2
isseen Listener
private void seenMessage(final String userid){
reference = FirebaseDatabase.getInstance().getReference("Chats").child(ChatKey);
// reference.keepSynced(true);
seenListener=new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Chat chat = snapshot.getValue(Chat.class);
if (chat.getReceiver().equals(fuser.getUid()) && chat.getSender().equals(userid)) {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("isseen", true);
snapshot.getRef().updateChildren(hashMap);
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
reference.addListenerForSingleValueEvent(seenListener);
}
回答1:
Do this in onBindViewHolder
@Override
public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {
Chat chat=mChat.get(position);
holder.show_message.setText(chat.getMessage());
boolean isSeen = chat.isIsseen();
if(isSeen){
//seen
holder.Delivered.setImageResource(R.drawable.ic_done_all_black_24dp);
}else{
//not seen
holder.Delivered.setImageResource(R.drawable.ic_check_black_24dp);
}
if (imageurl.equals("default")){
holder.profile_image.setImageResource(R.drawable.user2);
} else {
Glide.with(mContext).load(imageurl).into(holder.profile_image);
}
}
UPDATE:
If you want to refresh the recycler view for live updates add this method under the onBindViewHolder():
@Override
public void onDataChanged() {
//refresh
yourAdapter.notifyDataSetChanged();
}
来源:https://stackoverflow.com/questions/61483623/how-to-show-if-a-message-is-seen-or-not-via-using-firebase-real-time-database