Пейджинг 3. Почему нижний колонтитул повтора не вызывает метод загрузки моего источника PagingSource?

Я внедрил Paging 3 в свое приложение после codelab и добавил нижний колонтитул с кнопкой повтора через withLoadStateHeaderAndFooter:

recycler_view_results.adapter = adapter.withLoadStateHeaderAndFooter(
    header = UnsplashLoadStateAdapter { adapter.retry() },
    footer = UnsplashLoadStateAdapter { adapter.retry() }
)

Когда я нажимаю кнопку повтора в ViewHolder нижнего колонтитула, действительно вызывается adapter.retry(), так что настройка правильная. Однако этот метод никогда не заканчивается вызовом моего метода load PagingSource, как обычно.

My PagingSource (я проверил, что LoadResult.Error возвращается правильно в случае ошибки):

class UnsplashPagingSource(
    private val unsplashApi: UnsplashApi,
    private val query: String
) : PagingSource<Int, UnsplashPhoto>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, UnsplashPhoto> {
        val position = params.key ?: UNSPLASH_STARTING_PAGE_INDEX
        return try {
            val response = unsplashApi.searchPhotos(query, position, params.loadSize)
            val photos = response.results
            LoadResult.Page(
                data = photos,
                prevKey = if (position == UNSPLASH_STARTING_PAGE_INDEX) null else position - 1,
                nextKey = if (photos.isEmpty()) null else position + 1
            )
        } catch (exception: IOException) {
            return LoadResult.Error(exception)
        } catch (exception: HttpException) {
            return LoadResult.Error(exception)
        }
    }
}

Мой репозиторий:

class UnsplashRepository @Inject constructor(private val unsplashApi: UnsplashApi) {

    fun getSearchResultStream(query: String): Flow<PagingData<UnsplashPhoto>> {
        return Pager(
            config = PagingConfig(
                pageSize = NETWORK_PAGE_SIZE,
                enablePlaceholders = false
            ),
            pagingSourceFactory = { UnsplashPagingSource(unsplashApi, query) }
        ).flow
    }

    companion object {
        private const val NETWORK_PAGE_SIZE = 20
    }
}

А в своем фрагменте я делаю так:

private fun searchPhotos(query: String) {
    searchJob?.cancel()
    searchJob = lifecycleScope.launch {
        viewModel.searchPhotos(query).collectLatest {
            adapter.submitData(it)
        }
    }
}

Интересно, что кнопка повтора для пустого списка работает:

retry_button.setOnClickListener {
    adapter.retry()
    // this works
}

person Florian Walther    schedule 12.08.2020    source источник


Ответы (1)


Теперь он работает после того, как я обновил зависимость подкачки с «3.0.0-alpha02» до «3.0.0-alpha03». Похоже, это ошибка библиотеки.

Позже я также нашел соответствующий отчет об ошибке: https://issuetracker.google.com/issues/160194384

person Florian Walther    schedule 13.08.2020