我正在尝试使用适用于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
我想得到如下消息:
Message 1
Message 2
Message 3
Message 4
...
使用默认顺序,我会收到如上所示的消息,但limit
指令会将快照从1切割为50,并且未检索Message 51
(最新)。
答案 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);
}
另一种方法是从数据库中获取数据,将其添加到Collection
,List
是一个很好的解决方案,然后使用Collections.reverse(yourList);
。