Я начал миграцию из RecycledViewAdapter в PagedListAdapter, и для этого я использую RxPagedListBuilder с включенными ItemKeyedDataSource, BoundaryCallback и Placeholder.
Я имею в виду сетевые данные с базой данных как конструкцию кэша, которая предполагает, что BoundaryCallback будет вызываться, когда у моего источника данных (загрузки из локальной базы данных) заканчиваются данные.
Как оказалось, BoundaryCallback # onItemAtEndLoaded никогда не вызывается, и я был озадачен.
My ItemKeyedDataSource возвращает мою первую загруженную страницу (15 элементов) из базы данных + totalCount всех доступных элементов, доступных для извлечения из сети (246) с помощью обратного вызова (data, totalCount) для loadInitial ()
Когда я прокручиваю свой список вниз, первые 15 элементов появляются, как и ожидалось, но затем я вижу кучу заполнителей, и вызовы BoundaryCallback не совершаются.
Я попытался проанализировать код, который должен выполнить вызов BoundaryCallback # onItemAtEndLoaded, и условие выглядит следующим образом (PagedList):
private void tryDispatchBoundaryCallbacks(boolean post) {
...
final boolean dispatchEnd = mBoundaryCallbackEndDeferred
&& mHighestIndexAccessed >= size() - 1 - mConfig.prefetchDistance;
if (!dispatchBegin && !dispatchEnd) {
return;
}
if (dispatchEnd) {
mBoundaryCallbackEndDeferred = false;
}
if (post) {
mMainThreadExecutor.execute(new Runnable() {
@Override
public void run() {
dispatchBoundaryCallbacks(dispatchBegin, dispatchEnd);
}
});
} else {
dispatchBoundaryCallbacks(dispatchBegin, dispatchEnd);
}
}
Вы можете видеть, что mHighestIndexAccessed должно быть больше, чем size () - 1 - mConfig.PrefetchDistance; однако size () оценивается следующим образом:
mLeadingNullCount + mStorageCount + mTrailingNullCount
Проще говоря, он добавляет заполнители в расчет (возвращает 246). Таким образом, в случае обращения к 16-му элементу это оценивается как 15> 246 - 1 - 15 => 15> 230. Другими словами, BoundaryCallback никогда не будет вызывать свой метод, пока я не прокручиву весь путь до конца (прокручивая все заполнители).
Что мне не хватает?