Я использую утилиту просмотра с FirestorePagingAdapter
для отображения некоторых документов из коллекции Firestore.Мне нужно показать дополнительный элемент в качестве заголовка (для которого данные не приходят из адаптера).Для простоты предположим, что у меня есть только один тип представления и заголовок.Так что мой getItemViewType()
метод будет выглядеть следующим образом.
@override
public int getItemViewType(int position) {
if(position==0) return ViewType.HEADER;
else return ViewType.BODY_ITEM;
}
Внутри onBindViewHolder()
Я делаю это
@override
protected void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position, @NonNull final MyModel model) {
if(holder instanceof HeaderHolder){
holder.bind();
return;
}
// because first item from adapter is shown at recyclerview's second position
// based on the assumption that the parameter 'position' is recyclerview's position
DocumentSnapshot mDocumentSnapshot = this.getCurrentList().get(position-1);
holder.bindTo(mDocumentSnapshot);
}
Итак, я переопределил метод getItemCount()
следующим образом
@override
public int getItemCount() {
// because there is one extra header
return super.getItemCount()+1;
}
Но из-за этого происходит сбой моего приложения, и регистрируется следующее сообщение об ошибке
java.lang.IndexOutOfBoundsException: Item count is zero, getItem() call is invalid
at android.arch.paging.AsyncPagedListDiffer.getItem(AsyncPagedListDiffer.java:194)
at android.arch.paging.PagedListAdapter.getItem(PagedListAdapter.java:156)
at com.firebase.ui.firestore.paging.FirestorePagingAdapter.onBindViewHolder(FirestorePagingAdapter.java:128)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
(только первые несколько строк). В моей коллекции Firestore 12 документов.Если я не переопределю метод getItemCount()
, то в обзоре утилит будет показано 12 элементов, включая заголовок.Последний документ извлекается адаптером, но не отображается в программе повторного просмотра.Но переопределение метода getItemCount()
приводит к падению приложения (как упоминалось выше).
Я прочитал (по крайней мере, попытался прочитать :)) исходный код для AsyncPagedListDiffer
, PagedListAdapter
и FirestorePagingAdapter
.. Исключение java.lang.IndexOutOfBoundsException: Item count is zero, getItem() call is invalid
выбрасывается AsyncPagedListDiffer
getItem()
method.
private PagedList<T> mPagedList;
private PagedList<T> mSnapshot;
.......................
.......................
.......................
public T getItem(int index) {
if (mPagedList == null) {
if (mSnapshot == null) {
throw new IndexOutOfBoundsException(
"Item count is zero, getItem() call is invalid");
} else {
return mSnapshot.get(index);
}
}
mPagedList.loadAround(index);
return mPagedList.get(index);
}
Теперь, почему генерируется это исключение? Как я могу решить это?Каковы альтернативы моему подходу для добавления заголовка (опять же данные, показанные этим, не поступают из адаптера) к представлению переработчика.
Также параметр 'position' передается в `onBindViewHolder () `на самом деле позиция адаптера или обзор рециркулятора для добавления нового элемента (документация называет эту позицию адаптера, но я не уверен)