按时间戳升序对 X 个最新的 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();
}
}
}
});

编辑:我删除了多余的代码。按降序排序会导致消息在查询时按这样布局,查询的最新消息显示在顶部,这不起作用,因为我希望底部的最新消息向上下降:

  • 已查询消息5<-最新查询
  • 查询消息4
  • 查询消息3
  • 查询消息2
  • 已查询消息1<-最早的已查询
  • 查询后新增消息1<</li>

通过布局管理器使用 setReverseLayout 反转回收器视图会更正查询消息的顺序,但会在回收器视图的顶部插入新消息:

  • 查询后新增消息 1<</li>
  • 已查询消息1<-最早的已查询
  • 查询消息2
  • 查询消息3
  • 查询消息4
  • 已查询消息5<-最新查询

您需要按降序排列消息才能获得 10 条最新消息。

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

这将为您提供最新的项目。添加消息时,您将获得最新的消息,并且您将获得查询中掉出的消息的REMOVED事件。

假设您按时间倒序请求消息,则必须再次反转消息客户端,以便在应用中以正确的顺序显示它们。

最新更新