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

b-f*_*-fg 5 java android firebase firebaseui google-cloud-firestore

我正在尝试使用Cloud Firestore的Firebase-UI库创建聊天。 这个 github仓库包含我正在使用的相关代码。问题与查询的顺序有关。

看到查询指定为:

Query sChatQuery = sChatCollection.orderBy("timestamp").limit(50);
Run Code Online (Sandbox Code Playgroud)

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

Query sChatQuery = sChatCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(50);
Run Code Online (Sandbox Code Playgroud)

这会检索50条最新消息,但顺序错误(最新消息排在最前面,最旧消息排在最下面)。因此,我不知道该怎么做。

我可以在本地再次反转查询的结果,但是我无法弄清楚该怎么做(我已经走过了FirebaseUI库,但运气不佳)。

编辑

chat对于events集合中的每个事件,我都有其子集合:

events/event_doc/chat/chat_doc

在此处输入图片说明

我想得到如下消息:

Message 1
Message 2
Message 3
Message 4
...
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*amo 2

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

Query sChatQuery = sChatCollection
    .orderBy("timestamp", Query.Direction.ASCENDING)
    .whereGreaterThanOrEqualTo("timestamp', desiredTime)
    .limit(50);
Run Code Online (Sandbox Code Playgroud)

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

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是创建您自己的适配器来扩展FirebaseListAdapter和重写getItem()方法,如下所示:

@Override
public HashMap getItem(int pos) {
    return super.getItem(getCount() - 1 - pos);
}
Run Code Online (Sandbox Code Playgroud)

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