【发布时间】:2019-08-19 19:21:40
【问题描述】:
我不确定如何监听 Firestore 数据库中的更改并更新 RecyclerView 中的项目。
我正在尝试使用 Firestore 数据库创建聊天应用程序。现在我想实现一个功能,发送者可以看到接收者是否看到了消息。最初,在来自发件人的最后一条消息附近有“已发送”状态。接收者打开聊天室后,状态应立即更改为“已看到”。 我正在关注 YouTube 上 KOD Dev 的教程“使用 Firebase 聊天应用程序第 14 部分”,但使用的是 Firestore db 而不是实时数据库。
有部分聊天模型,带有RecyclerView 的活动和适配器。
public class Chat {
private String sender;
private String receiver;
private String message;
private boolean isseen;
public Date sent_timestamp;
public Chat(String sender, String receiver, String message, boolean isseen, Date sent_timestamp) {
this.sender = sender;
this.receiver = receiver;
this.message = message;
this.isseen = isseen;
this.sent_timestamp = sent_timestamp;
private void seenMessage(final String userid) {
Query query = mFirebaseFirestore.collection("Chats");
query.addSnapshotListener(this, new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
for (DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) {
if (doc.getType() == DocumentChange.Type.ADDED) {
QueryDocumentSnapshot docEvent = doc.getDocument();
Chat chat = doc.getDocument().toObject(Chat.class);
if (chat.getReceiver().equals(fuser.getUid()) && chat.getSender().equals(userid)) {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("isseen", true);
doc.getDocument().getReference().update(hashMap);
}
}
}
}
});
private void readMessages(final String myid, final String userid, final String imageurl) {
mchat = new ArrayList<>();
messageAdapter = new MessageAdapter(MessageActivity.this, mchat, imageurl);
recyclerView.setAdapter(messageAdapter);
Query query = mFirebaseFirestore.collection("Chats").orderBy("sent_timestamp", Query.Direction.ASCENDING);
query.addSnapshotListener(this, new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
for (DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) {
if (doc.getType() == DocumentChange.Type.ADDED) {
QueryDocumentSnapshot docEvent = doc.getDocument();
Chat chat = doc.getDocument().toObject(Chat.class);
if (chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
chat.getReceiver().equals(userid) && chat.getSender().equals(myid)) {
mchat.add(chat);
}
}
messageAdapter.notifyDataSetChanged();
}
}
});
}
@Override
public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {
Chat chat = mChat.get(position);
if (position == mChat.size() - 1) {
if (chat.isIsseen()) {
holder.txt_seen.setText("Seen");
} else {
holder.txt_seen.setText("Delivered");
}
} else {
holder.txt_seen.setVisibility(View.GONE);
}
一旦值“isseen”更改为“true”,它就会显示在发件人的手机上。
【问题讨论】:
标签: java android firebase android-recyclerview google-cloud-firestore