android - 在Firestore中使用分页时,如何获取正确的newIndex?

标签 android firebase kotlin google-cloud-firestore

我已经根据文档实现了分页。我在我的项目中使用以下代码:

override fun onEvent(querySnapshot: QuerySnapshot?, e: FirebaseFirestoreException?) {
    if (e != null) return

    for (documentChange in querySnapshot!!.documentChanges) {
        value = when (documentChange.type) {
            Type.ADDED -> {
                Log.d("TAG", "oldIndex:" + documentChange.oldIndex + "/" + "newIndex:" + documentChange.newIndex)
            }
            Type.MODIFIED -> {
                Log.d("TAG", "oldIndex:" + documentChange.oldIndex + "/" + "newIndex:" + documentChange.newIndex)
            }
            Type.REMOVED -> {
                Log.d("TAG", "oldIndex:" + documentChange.oldIndex + "/" + "newIndex:" + documentChange.newIndex)
            }
        }
    }
}
当我使用此查询获取前4个用户时:
var query: Query = db.collection("users")
    .orderBy("name", DESCENDING)
    .limit(4)
我得到:
A/oldIndex:-1/newIndex:0
B/oldIndex:-1/newIndex:1
C/oldIndex:-1/newIndex:2
D/oldIndex:-1/newIndex:3
这是正确的,因为所有用户都是新用户,并且oldIndex等于-1。 newIndex从0递增到3,这也是正确的。但是,当我使用此查询时:
var secondQuery: Query = db.collection("users")
    .orderBy("name", DESCENDING)
    .startAfter(lastVisibleUser)
    .limit(4)
要获得接下来的4位用户,我得到:
E/oldIndex:-1/newIndex:0
F/oldIndex:-1/newIndex:1
G/oldIndex:-1/newIndex:2
H/oldIndex:-1/newIndex:3
用户名正确的地方,oldIndex还是正确的,但是newIndex应该从0开始,而不是从4开始。如何第二次获得正确的newIndex?

最佳答案

将为快照获取的索引与相同侦听器的的先前快照进行比较。由于您触发了一个新查询,因此它是一个新的侦听器,因此所有索引都基于一个空的先前状态。
要查看索引如何完成的工作,请将永久侦听器附加到查询中,然后在第一个查询中更改一个用户的名称,以使其更改其在结果中的位置。您将看到所有用户的先前索引和新索引将根据先前快照和新状态进行更新。

关于android - 在Firestore中使用分页时,如何获取正确的newIndex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63034510/

相关文章:

android - 安卓中的 "how to close keyboard with smooth slowly animation"

javascript - Firebase 中的 auth.currentUser.updateProfile 之后未触发 auth.onAuthStateChanged

node.js - Firebase 云功能 Firestore 触发器 onWrite 在本地测试时未按预期运行

string - 拆分函数 Kotlin 如何使用多个拆分参数

android - 放大和缩小自定义相机 - 空指针异常

java - Android 中 doInBackground() 方法中出现致命异常 :Async Task java. lang.OutOfMemoryError?

javascript - reauthenticateWithCredential 错误获取错误 TypeError : credential. _getReauthenticationResolver 不是函数(firebase 9)

generics - Kotlin 用子类型覆盖 fun

kotlin - 在 TornadoFX 中,如何将布局分离到不同的类,然后在生成器中使用它们?

android - 媒体编解码器 : MediaFormat setting KEY_I_FRAME_INTERVAL value is ignored