使用 Firebase-UI (Android) 的 Firestore 聊天应用

Firestore chat app using Firebase-UI (Android)

我正在尝试使用 Cloud Firestore 的 Firebase-UI 库创建聊天。 This github 存储库包含我正在使用的相关代码。 问题来自查询的顺序。

看到查询指定为:

Query sChatQuery = sChatCollection.orderBy("timestamp").limit(50);

但是,我收到的是最旧的 50 条消息,而不是最新的消息,顺序是正确的(从旧到新)。另一方面,我可以使用以下查询:

Query sChatQuery = sChatCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(50);

这会检索 50 条最新的消息,但顺序错误(最新在上,最旧在下)。因此我不知道如何做对。

我可以在本地再次反转查询结果,但我不知道该怎么做(我已经通过了 FirebaseUI 库,但没有运气)。

编辑

我的 events collection:

中的每个事件都有我的 chat subcollection

events/event_doc/chat/chat_doc

我想收到如下消息:

Message 1
Message 2
Message 3
Message 4
...

使用默认顺序我得到如上所示的消息,但是 limit 指令将快照从 1 减少到 50,并且 Message 51(最新的)未被检索。

要解决这个问题,您可以使用以下查询:

Query sChatQuery = sChatCollection
    .orderBy("timestamp", Query.Direction.ASCENDING)
    .whereGreaterThanOrEqualTo("timestamp', desiredTime)
    .limit(50);

如果您使用 RecyclerView 显示数据,最简单的方法是使用以下代码:

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);

此方法将根据需要反转顺序。

另一种方法是创建自己的适配器来扩展 FirebaseListAdapter 并覆盖 getItem() 方法,如下所示:

@Override
public HashMap getItem(int pos) {
    return super.getItem(getCount() - 1 - pos);
}

另一种方法是从数据库中获取数据,将其添加到 CollectionList 将是一个很好的解决方案,然后使用 Collections.reverse(yourList);.