Я хотел бы сделать recyclerView с нумерацией страниц в своем проекте. Однако я застрял в процессе.
Мои данные firestore построены следующим образом (некоторые документы имеют значение visible=false, поэтому я не хочу, чтобы они отображались):
Теперь мне нужно было получить первые 5 документов, упорядоченных по dateCreated, а затем продолжить разбиение на страницы по последнему значению, которое я ранее получил.
Я попытался использовать следующее:
db
.collection( "Quotes" )
.whereEqualTo( "visibility", true )
.orderBy("dateCreated", Query.Direction.DESCENDING )
.startAfter("dateCreated", dateCreatedOrig
.get(dateCreatedOrig.size()-1))
.limit(5)
.get()
.addOnCompleteListener( task -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
...
}
}
dAdapter = new Ddapter(...);
ddapter.notifyDataSetChanged();
rv_Quotes.setAdapter( ddapter );
}
} );
Где dateCreatedOrig — это список, который содержит отметку времени первого запроса, поэтому я получаю последнюю отметку времени, чтобы продолжить разбиение на страницы оттуда.
Однако я получаю следующую ошибку:
java.lang.IllegalArgumentException: для startAfter() предоставлено слишком много аргументов. Количество аргументов должно быть меньше или равно количеству предложений orderBy().
Есть идеи?
Что вы подразумеваете под get() не принимает никаких параметров? Должен брать или не должен? По моему опыту, я никогда не вставлял в него параметры, как в этом случае.
Посмотрите документацию по API для ясности. Если у вас нет исходного объекта для передачи, он не принимает аргументы. Ваш код явно пытается пройти dateCreatedOrig.size()-1)?
DateCreateOrig — потерянный, содержащий даты из первого запроса. Например, когда я впервые загрузил 5 результатов, я получил список из 5 значений метки времени, таких как 19.12.2020, 21.12.2020, 24.12.2020, 26.12.2020... Затем, когда я попытался разбить на страницы, я хотел, чтобы он запускался после документ, дата создания которого находится после 21.12.2020, например, который загрузит следующие 5 документов. Когда я написал dateCreatedOrog.size()-1, я попытался получить метку времени последнего документа из моего первого запроса. Я имею в виду, если я передам startAfter с пустым значением, как он узнает, откуда начинать запрос bext?
Проблема здесь в том, что вы передаете 2 аргумента startAfter. Если вы посмотрите документацию для startAfter, вы увидите, что она:
Создает и возвращает новый запрос, который начинается после предоставленных полей относительно порядка запроса. Порядок значений полей должен совпадать с порядком по пунктам запроса
Это означает, что вы определяете имя поля, которое будет использоваться в предложении orderBy, а не в startAfter, и оба должны использоваться вместе. Итак, в вашем случае все, что нужно сделать, это удалить первый аргумент startAt, и это сработает, поэтому это может выглядеть так:
db.collection( "Quotes" )
.whereEqualTo( "visibility", true )
.orderBy("dateCreated", Query.Direction.DESCENDING )
.startAfter(dateCreatedOrig.get(dateCreatedOrig.size()-1))
.limit(5)
.get()
.addOnCompleteListener(...);
Рад помочь :)
get()
не принимает никаких параметров. Кроме того, вы не закрыли скобки при вызовеstartAfter()
. Это становится очевидным после того, как я переформатировал ваш код в вопросе.