使用 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);
}
另一种方法是从数据库中获取数据,将其添加到 Collection
,List
将是一个很好的解决方案,然后使用 Collections.reverse(yourList);
.
我正在尝试使用 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);
}
另一种方法是从数据库中获取数据,将其添加到 Collection
,List
将是一个很好的解决方案,然后使用 Collections.reverse(yourList);
.