Java 如何将永久侦听器附加到Firestore查询?

Java 如何将永久侦听器附加到Firestore查询?,java,android,firebase,android-recyclerview,google-cloud-firestore,Java,Android,Firebase,Android Recyclerview,Google Cloud Firestore,我正在尝试在Firestore中实现分页。我创建了一个EventListener对象,如下所示: EventListener<QuerySnapshot> listener = (querySnapshot, e) -> { if (e != null) return; for (DocumentChange documentChange : querySnapshot.getDocumentChanges()) { //Get data

我正在尝试在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);
};
在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的说法,我正在使用多个侦听器,这确实是我正在做的,因为我使用了两次
query.addSnapshotListener()
。我的问题是,如何用第二个查询替换第一个查询,而不附加新的侦听器?如何始终使用同一个侦听器?

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


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

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


PS:这只是一个建议,不是对您问题的回答。

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


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

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


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

谢谢您的建议,但我将继续使用Firestore。谢谢您的建议,但我将继续使用Firestore。您知道如何跟踪不同侦听器之间的索引吗?嗯,这将需要大量代码来管理该状态。我不认为有一个简单的解决方法。你知道如何在不同的侦听器之间跟踪索引吗?嗯,这需要大量代码来管理这种状态。我认为没有一条简单的出路。
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);