有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

显示Firebase查询的RecyclerView开始处的java插入对象

我正在使用Firebase进行聊天活动来存储消息,并使用RecyclerView来显示它们。根据下面的适配器构造函数,初始化RecyclerView时,从Cloud Firestore查询最后50条消息,并按Unix时间戳降序排列。然后,我在聊天活动中使用setStackFromEnd(true)来翻转它们的显示顺序,因为最新消息应该位于底部附近,并且使用messageList将新消息添加到适配器的消息列表中。添加(0,消息)

这是一个问题。在onBindViewHolder中,以前可接受的:

Message message = messageList.get(position);

holder.message.setText(message.getMessage());
holder.author.setText(message.getAuthor() + ":");

不再工作,因为在加载RecyclerView(位置0)时,输入到RecyclerView的消息将重复最近的消息。i、 e:

  • 信息一
  • 信息一
  • 信息一
  • 信息一

而不是:

  • 信息一
  • 信息二
  • 信息三
  • 信息四

其中“message one”是创建RecyclerView时的最新消息。将此替换为:

Message message = messageList.get(0);

holder.message.setText(message.getMessage());
holder.author.setText(message.getAuthor() + ":");

onBindViewHolder中,要获得真实的最新消息,它将显示在屏幕上,但随后也会在回收时用最新消息替换所有项目。最终,我希望查询的消息按照最近的顺序从下到上列出,同时继续将最新的消息放在底部(就像所有聊天应用程序一样),而不必查询整个集合。我应该在哪里纠正我的错误,如何纠正

适配器构造函数:

public ChatRecyclerViewAdapter(Context mContext, ArrayList<String> mMessage, ArrayList<String> mAuthor, String mRoomID, FirebaseFirestore firestore) {
        messageList = new ArrayList<>();
        firestore = FirebaseFirestore.getInstance();
        mCollection = firestore.collection(mRoomID + "_messages");
        Query query = mCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(50);
        query.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                for (DocumentChange documentChange : queryDocumentSnapshots.getDocumentChanges()) {
                    switch (documentChange.getType()) {
                        case ADDED:
                            documentChange.getDocument();
                            Message message = documentChange.getDocument().toObject(Message.class);
                            messageList.add(0,message);
                            notifyItemInserted(messageList.size());
                    }
                }
            }
        });

尝试查询滚动条上的下一组旧消息:

 query.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                if (queryDocumentSnapshots.size() > 0) {
                    //Get the last visible document
                    DocumentSnapshot lastVisible = queryDocumentSnapshots.getDocuments().get(messageList.size()-1);

                    //Construct a new query starting at this document and get the next batch of messages
                    Query next = mCollection.orderBy("timestamp", Query.Direction.DESCENDING).startAfter(lastVisible).limit(20);
                    next.get();
                }
            }
        });

共 (1) 个答案

  1. # 1 楼答案

    代码中的问题是使用Unix timestamp而不是使用Date对象按降序排序。为了让它工作,我建议您更改将时间戳存储为日期的方式。关于这一点,请参阅我的回答,我已经解释了如何使用POJO classMap实现这一点

    在这里,您可以找到一个关于如何创建Chat App的教程,我在这里解释了与您所寻找的完全相同的内容。请参见下面的屏幕截图:

    enter image description here

    在我用作查询的代码中,以下代码行:

    val query = rootRef!!
        .collection("messages")
        .document(roomId)
        .collection("roomMessages")
        .orderBy("sentAt", Query.Direction.ASCENDING)