听取集合中的多个文档并更新recyclerview

时间:2019-08-19 19:21:40

标签: java android firebase android-recyclerview google-cloud-firestore

我不确定如何监听Firestore数据库中的更改以及如何更新RecyclerView中的项目。

我正在尝试使用Firestore数据库做一个聊天应用程序。现在,我想实现一个功能,发件人可以查看收件人是否看到了邮件。最初,发件人的最后一封邮件附近有“已送达”状态。接收者打开聊天室后,状态应立即更改为“已看到”。 我正在观看YouTube上KOD Dev的教程“ Chat App with Firebase Part 14”,但使用Firestore db而非Realtime数据库。

聊天模型,使用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”,它应立即显示在发送者的电话上。

2 个答案:

答案 0 :(得分:0)

尝试下面的查询

Query query = mFirebaseFirestore.collection("Chats").whereEqualTo("isseen", true);

它将在isseen = true以及任何“ isseen”实时更改为true时提供所有消息的列表。

答案 1 :(得分:0)

我没有遵循该教程,但是我可以告诉您如何在我的chat app中实现可见功能

因此,我将尝试跟踪特定用户已经看到的最后一条消息。在聊天应用程序中的大多数情况下,Beucase消息按其创建时间戳排序显示,这意味着您需要跟踪他们所看到的最新消息的时间戳。因为在多用户环境中,大规模的操作有时会导致两个用户可以同时读取同一条消息,所以我建议您还存储其文档ID。有了这些信息,您现在就只能查询上次存储的时间戳之后的新文档:

yourCollRef.startAfter(...)...