按时间戳对X个最新的Firestore文档升序进行排序,并实时添加

时间:2018-10-21 22:56:16

标签: android firebase google-cloud-firestore

我正在尝试使用Firestore创建聊天应用程序。我的消息类具有一个Date对象形式的时间戳。我希望聊天活动加载最新的X消息,并使用SnapshotListener实时将任何新消息添加到底部。到目前为止,这是我到目前为止的内容,它按时间戳对X个最旧的消息进行排序,但是如果已经删除了完整的X条消息,则会忽略此后的所有消息,并且在添加新消息时不显示任何新消息。

 final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(linearLayoutManager);


        Query query = mCollection.orderBy("timestamp",Query.Direction.ASCENDING).limit(mCurrentPage * TOTAL_ITEMS_TO_LOAD);


        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:
                            Message message = documentChange.getDocument().toObject(Message.class);



                            mMessages.add(message);
                            mAdapter.notifyDataSetChanged();

                    }
                }
            }
        });

编辑:我已经删除了多余的代码。按降序排序会导致在查询时这样排列邮件,将查询的最新消息显示在顶部,这是行不通的,因为我想让最新的消息在底部向下递增:

  • queriedmessage5 <-最新查询
  • queriedmessage4
  • queriedmessage3
  • queriedmessage2
  • queriedmessage1 <-最早查询的
  • newmessage1 <-查询后添加

通过布局管理器使用setReverseLayout反转RecyclerView可以更正查询消息的顺序,但随后在RecyclerView的顶部插入新消息:

  • newmessage1 <-查询后添加
  • queriedmessage1 <-最早查询的
  • queriedmessage2
  • queriedmessage3
  • queriedmessage4
  • queriedmessage5 <-最新查询

1 个答案:

答案 0 :(得分:1)

您需要对降序排列的消息进行排序,以获取最新的10条消息。

mCollection.orderBy("timestamp",Query.Direction.DESCENDING).limit(mCurrentPage * TOTAL_ITEMS_TO_LOAD)

这将为您提供最新的物品。添加邮件时,您将获得最新的邮件,并且会为查询之外的邮件获得REMOVED事件。

鉴于您以倒序的顺序请求消息,则必须再次反转消息客户端,以在应用程序中以正确的顺序显示它们。