Я застрял с нумерацией страниц Firestore. Я пытаюсь сделать запрос упорядоченным по плавающему значению (рейтингу).
Если я использую нумерацию страниц с запросом, упорядоченным по имени, он будет работать нормально. Но с рейтингом он загружает первую страницу в цикле и не может получить страницу новых пользователей по последнему увиденному uid.
Может причина звучит так: у части пользователей самый высокий рейтинг, но у большинства из них одинаковый, например, у 10 пользователей будет 14,4 балла?
Буду очень признателен, если вы дадите мне несколько советов или несколько советов, как исправить эту странную ошибку)
Вот код нумерации страниц:
class SearchRepository {
companion object {
const val ITEMS_PER_PAGE = 20
}
private var lastUserInPage = ""
private val reference: CollectionReference = FirebaseFirestore.getInstance().collection(Consts.USERS_DB)
//todo: rename getUsersNextPage(isFirstPage: Boolean)
fun getUsers(filterParams: List<SearchModel>, usersListCallback: UsersListCallback, page: Int) {
var query: Query = reference
if (!filterParams.isEmpty()) {
for ((key, value) in filterParams) {
query = query.whereEqualTo(key, value)
}
}
//not forget to set to zero when using from another fragment
if (page == 0)
lastUserInPage = ""
query
.orderBy(Consts.RATING)
.startAt(lastUserInPage)
.limit(ITEMS_PER_PAGE.toLong())
.get()
.addOnCompleteListener { task ->
putCallbackData(usersListCallback, task) }
}
private fun putCallbackData(usersListCallback: UsersListCallback, task: Task<QuerySnapshot>) {
val fsUserList = ArrayList<FsUser>()
for (snapshot in task.result!!.documents) {
if (isUserExist()) {
if (snapshot.id != getUid()) {
fsUserList.add(snapshot.toObject(FsUser::class.java)!!)
}
} else {
fsUserList.add(snapshot.toObject(FsUser::class.java)!!)
}
}
lastUserInPage = fsUserList[fsUserList.size - 1].uid
// some firebase stuff
if (fsUserList.size == ITEMS_PER_PAGE) {
fsUserList.removeAt(fsUserList.size - 1)
} else if (fsUserList.size == ITEMS_PER_PAGE - 1 && isUserExist()) {
fsUserList.removeAt(fsUserList.size - 1)
}
usersListCallback.setUsers(fsUserList)
}
}