Пейджинг 3. Почему нижний колонтитул повтора не вызывает метод загрузки моего источника PagingSource?
Я внедрил Paging 3 в свое приложение после codelab и добавил нижний колонтитул с кнопкой повтора через withLoadStateHeaderAndFooter
:
recycler_view_results.adapter = adapter.withLoadStateHeaderAndFooter(
header = UnsplashLoadStateAdapter { adapter.retry() },
footer = UnsplashLoadStateAdapter { adapter.retry() }
)
Когда я нажимаю кнопку повтора в ViewHolder нижнего колонтитула, adapter.retry()
действительно называется, значит, настройка верна. Однако этот метод никогда не заканчивается вызовом моего PagingSourceload
метод, как обычно.
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
}
1 ответ
Теперь он работает после того, как я обновил зависимость подкачки с "3.0.0-alpha02" до "3.0.0-alpha03". Похоже, это ошибка библиотеки.
Впоследствии я также нашел соответствующий отчет об ошибке: https://issuetracker.google.com/issues/160194384