【问题标题】:Firestore chat app using Firebase-UI (Android)使用 Firebase-UI (Android) 的 Firestore 聊天应用
【发布时间】:2018-10-06 12:55:10
【问题描述】:

我正在尝试使用 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 集合中的每个事件都有我的chat 子集合:

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).limit(50);
  • 是的,这似乎是默认顺序:Query sChatQuery = sChatCollection.orderBy("timestamp").limit(50);
  • 请将您的数据库结构添加为屏幕截图,并通过具体示例说明您想要获取的确切顺序。
  • 更新了问题。

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


【解决方案1】:

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

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

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

【讨论】:

  • 在发布问题之前,我已经在使用setReverseLayout 技巧,但这似乎不是最好的解决方案。关于您提到的最后一种方法,我如何使用FirestoreRecyclerAdapter 做到这一点?
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多