Android пейджинговая библиотека не запускает loadAfter()

Я использую новую платформу Android Paging, чтобы получить RecyclerView с бесконечной прокруткой. Я не могу понять, почему библиотека не запускает метод loadAfter(), когда я настраиваю свой PagedList следующим образом:

val config: PagedList.Config = PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setPageSize(10)
                .setPrefetchDistance(1)
                .setInitialLoadSizeHint(10)
                .build()
val pageList = PagedList.Builder(LookDataSource(lookList), config)
                .setInitialKey(0)
                .setMainThreadExecutor(MainThreadExecutor())
                .setBackgroundThreadExecutor(PaginationThreadPoolExecutor())
                .setBoundaryCallback(LookBoundaryCallback())
                .build()

Примечание: мое prefetchDistance равно 1, так как я хочу загрузить другую партию данных, когда будет отображаться последний элемент. В документации говорится, что 0 будет никогда не загружать больше данных

Мой DataSource - это файл PageKeyedDataSource, а ключ - индекс страницы.

Я изучил исходный код ContiguousPagedList, который является особым PagedList, созданным при использовании источника PageKeyedDataSource, и я не могу понять их:

@MainThread
@Override
protected void loadAroundInternal(int index) {
    int prependItems = mConfig.prefetchDistance - (index - mStorage.getLeadingNullCount());
    int appendItems = index + mConfig.prefetchDistance
            - (mStorage.getLeadingNullCount() + mStorage.getStorageCount());

    mPrependItemsRequested = Math.max(prependItems, mPrependItemsRequested);
    if (mPrependItemsRequested > 0) {
        schedulePrepend();
    }

    mAppendItemsRequested = Math.max(appendItems, mAppendItemsRequested);
    if (mAppendItemsRequested > 0) {
        scheduleAppend();
    }
}

Согласно моей конфигурации, значение appendItems равно 0, когда отображается последний элемент

int appendItems = index + mConfig.prefetchDistance - (mStorage.getLeadingNullCount() + mStorage.getStorageCount());

с

  • index + 9 (последний элемент с размером страницы 10 элементов)
  • prefetchDistance - 1
  • leadingNullCount всегда 0 (не уверен, что я понимаю этот атрибут)
  • storageCount - это параметр pageSize, который я сконфигурировал выше (в соответствии с исходным кодом этого класса)

дает

int appendItems = 9 + 1 (0 - 10)

Исходя из этого, scheduleAppend() никогда не вызывается, поскольку mAppendItemsRequested также всегда 0.

Единственный способ, которым я обнаружил, что на самом деле загружать больше данных в прокрутку, - это установить для моего prefetchDistance значение, превосходящее 1. Это, как говорится, похоже на обходное решение, чем хороший ответ на эту проблему.

Ответ 1

Замените ListAdapter на PagedListAdapter