Как показать еще один элемент, чем размер списка FirestorePagingAdapter, в начале RecyclerView - PullRequest
0 голосов
/ 20 апреля 2019

Я использую утилиту просмотра с 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 () `на самом деле позиция адаптера или обзор рециркулятора для добавления нового элемента (документация называет эту позицию адаптера, но я не уверен)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...