【问题标题】:Listen to multiple documents in a collection and update recyclerview监听集合中的多个文档并更新recyclerview
【发布时间】: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


    【解决方案1】:

    试试下面的查询

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

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

    【讨论】:

      【解决方案2】:

      我没有按照该教程进行操作,但我可以告诉您如何在chat app 中实现 seen 功能

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

      yourCollRef.startAfter(...)...
      

      【讨论】:

      • 嗨,垃圾!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我会很感激的。谢谢!
      猜你喜欢
      • 2020-10-27
      • 2020-03-17
      • 2012-12-21
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 2021-01-08
      相关资源
      最近更新 更多