Android Pagination BoundaryCallback с заполнителями не работает правильно? - PullRequest
0 голосов
/ 21 июня 2019

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

Что мне не хватает?

...