PagingLibrary с recyclerView не может остановить loadAfter()

loadAfter() не может остановиться, хотя я не прокручивал RecyclerView. Он продолжает вызывать onBindView->loadAfter()

Я пытался отладить, нашел это: метод loadAroundInternal в классе ContiguousPagedList

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

index сохранить ++, в то время как getBindView в recyclerView больше, appendItem всегда >0

Я не уверен, но я думаю, может быть

network->appendPage->notifyInserted->bindView->loadAfter->network

затем адаптер recyclerView выполняет onBindView. Но вызывается bindViewHolder, позиция которого не должна вызываться. Так что это не может остановиться.

Я не знаю, прав я или нет. И я не знаю, как это исправить.

ниже приведен соответствующий код, который я написал:

@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
    VB binding = DataBindingUtil.getBinding(holder.itemView);
    setData(binding, getItem(position));
    binding.executePendingBindings();
}

В моем собственном PagingDataSource, который расширяет PageKeyedDataSource.

@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, T> callback) {
    singleCreator.createSingle(params.key, params.requestedLoadSize)
            .subscribe(new SingleObserver<Page<T>>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onSuccess(Page<T> tPage) {
                    callback.onResult(tPage.list, tPage.pageNumber + 1);
                }

                @Override
                public void onError(Throwable e) {

                }
            });

}

public interface SingleCreator<T> {
    SingleSubscribeProxy<Page<T>> createSingle(int page, int pageSize);
}

Если нужны другие вещи, я отредактирую вопрос

=====================================

Добавить сообщение: я обнаружил, что если я устанавливаю абсолютное значение для высоты recyclerView, например 100dp, оно работает нормально. Но работайте с проблемой, когда wrap_content и match_parent.

Итак, теперь проблема заключается в следующем: когда 2 recyclerViews в вложенномScrollView и с wrap_content или match_parent, bindView не может остановить loadAfter(), который является методом библиотеки подкачки.


person user2545386    schedule 15.11.2018    source источник


Ответы (1)


Итак, причина, по которой это произошло, когда результат сети возвращается, обновление recycleView. Поскольку он находится во вложенном ScrollView, он не имеет точной высоты. Затем onSizeChanged->getItem->network.

Для меня решение состоит в том, чтобы написать собственный linearLayout, который реализует NestedScrollingParent2;

person user2545386    schedule 18.11.2018