代码之家  ›  专栏  ›  技术社区  ›  b-fg

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

  •  6
  • b-fg  · 技术社区  · 7 年前

    我正在尝试使用Firebase UI库为云Firestore创建聊天。 This github存储库包含我正在使用的相关代码。 问题出现在查询的顺序上。

    请参见将查询指定为:

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

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

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

    这将检索50条最新消息,但顺序错误(最新的在顶部,最旧的在底部)。因此,我不知道如何做到这一点。

    我可以在本地再次反转查询的结果,但我不知道该怎么做(我已经遍历了FirebaseUI库,但运气不佳)。

    编辑

    我有我的 chat my中每个事件的子集合 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 回复  |  直到 7 年前
        1
  •  2
  •   Alex Mamo    7 年前

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

    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 A. List 将是一个很好的解决方案,然后使用 Collections.reverse(yourList);