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

时间:2018-04-25 23:08:52

标签: java android firebase google-cloud-firestore firebaseui

我正在尝试使用适用于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库而没有运气)。

修改

我的chat集合中的每个事件都有events个子集:

events/event_doc/chat/chat_doc

enter image description here

我想得到如下消息:

Message 1
Message 2
Message 3
Message 4
...

使用默认顺序,我会收到如上所示的消息,但limit指令会将快照从1切割为50,并且未检索Message 51(最新)。

1 个答案:

答案 0 :(得分:2)

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

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);

此approch会根据您的需要撤销订单。

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

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

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