Я хочу показать, замечено ли сообщение в моем приложении, которое использует базу данных реального времени Firebase. Что я могу до сих пор, так это обновить его в базе данных, если сообщение увидено или нет, но я нет возможность получить это значение с помощью прослушивателей в моем адаптере повторного просмотра. Бывает, что если последнее сообщение не видно, оно отображает, что все предыдущие сообщения не отображаются аналогично, если последнее сообщение отображается, оно отображает все предыдущие сообщения.
Структура базы данных
Мой код для проверки, является ли сообщение видимым или нет
@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);
}
}
Обновление
Класс чата
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);
}