使用Firebase-UI(Android)编写的Firestore聊天应用程序

6
我希望您能够使用Firebase-UI库来创建基于Cloud Firestore的聊天功能。这个 Github存储库包含我正在使用的相关代码。问题出在查询顺序上。
请注意,查询被指定为:
Query sChatQuery = sChatCollection.orderBy("timestamp").limit(50);

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

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

这会检索最新的50条消息,但顺序不正确(最新的在顶部,最旧的在底部)。因此,我不知道如何解决这个问题。
我可以在本地再次反转查询结果,但我无法弄清楚如何做到这一点(我已经通过FirebaseUI库进行了尝试,但没有成功)。
编辑:
我的“events”集合中为每个事件设置了一个“chat”子集合:
“events/event_doc/chat/chat_doc”

enter image description here

我想要按以下方式获取信息:

Message 1
Message 2
Message 3
Message 4
...

使用默认顺序,我收到的消息如上所示,但limit指令将快照从1到50截断,而Message 51(最新的消息)没有被检索到。

你尝试过使用 Query sChatQuery = sChatCollection.orderBy("timestamp", Query.Direction.ASCENDING).limit(50); 吗? - Alex Mamo
是的,而且这似乎是默认顺序:Query sChatQuery = sChatCollection.orderBy("timestamp").limit(50); - b-fg
请添加您的数据库结构截图,并指示您希望获取的确切顺序,附上具体示例。 - Alex Mamo
更新了问题。 - b-fg
1个回答

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

这种方法可以按照您想要的顺序反转结果。

另一种方法是创建一个自己的适配器,继承FirebaseListAdapter并重写getItem()方法,如下所示:

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

另一种方法是从数据库获取数据,将其添加到集合 (Collection) 中,使用列表 (List) 是一个不错的选择,然后使用 Collections.reverse(yourList) 倒转列表。

在发布问题之前,我已经使用了“setReverseLayout”技巧,但它似乎不是最好的解决方案。关于您提到的最后一种方法,我该如何在“FirestoreRecyclerAdapter”中实现? - b-fg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接