【问题标题】:How to attach a permanent listener to a Firestore query?如何将永久侦听器附加到 Firestore 查询?
【发布时间】:2020-11-14 02:37:08
【问题描述】:

我正在尝试在 Firestore 中实现分页。我创建了一个 EventListener 对象,如下所示:

EventListener<QuerySnapshot> listener = (querySnapshot, e) -> {
    if (e != null) return;

    for (DocumentChange documentChange : querySnapshot.getDocumentChanges()) {
        //Get data
    }
    lastVisible = querySnapshot.getDocuments().get(querySnapshot.size() - 1);
};

我也有这样的查询:

Query query = usersRef.orderBy("name", ASCENDING).limit(4);

在我的 onCreate 我这样做:

query.addSnapshotListener(MainActivity.this, listener);

为了在我的 RecyclerView 中实现分页,我使用:

RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {}

    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        query = query.startAfter(lastVisible);
        query.addSnapshotListener(MainActivity.this, listener);
    }
};
recyclerView.addOnScrollListener(onScrollListener);

意味着当用户达到限制时,我想加载下一个用户。但是,我没有得到正确的索引。根据 Frank van Puffelen 的answer,我正在使用多个侦听器,这确实是我正在做的,因为我使用了两次query.addSnapshotListener()。我的问题是,如何在不附加新侦听器的情况下用第二个查询替换第一个查询?如何始终使用同一个监听器?

【问题讨论】:

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


    【解决方案1】:

    我对分页的建议是使用本地数据库作为远程数据和应用程序之间的层。这个想法是,将数据放入您的数据库中,您可以完全控制数据的分页。例如,当您需要数据时,查询您的数据库,如果查询不存在,则查询您的 Firebase,将数据缓存到您的数据库中,这反过来会提供您的请求。 那就是流量。不明白的可以问我。

    PS:这只是一个建议,而不是你的问题的答案。

    【讨论】:

    • 感谢您的建议,但我会继续使用 Firestore。
    【解决方案2】:

    不可能简单地替换侦听器的查询。当您向查询添加侦听器时,它将永远使用该查询,直到侦听器被删除。

    如果您想开始获取新查询的结果,则必须重复该过程并为该新查询添加侦听器。如果需要,您可以使用相同的侦听器对象,但不能简单地“换入”新查询。

    【讨论】:

    • 您知道如何跟踪不同侦听器之间的索引吗?
    • 嗯,这将需要大量代码来管理该状态。我认为没有捷径可走。
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2022-08-03
    • 2021-08-07
    • 1970-01-01
    • 2020-06-06
    • 2021-08-12
    • 2011-06-01
    • 2014-12-01
    相关资源
    最近更新 更多