Я использую новую платформу 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. Это, как говорится, похоже на обходное решение, чем хороший ответ на эту проблему.