#android #kotlin #android-jetpack-compose #android-jetpack #android-paging
Вопрос:
Я пытаюсь составить список книг на странице, используя Jetpack Compose и библиотеку Android Paging 3. Я могу составить список подкачки и получить данные в порядке, но load()
функция моего источника данных подкачки вызывается бесконечно, без прокрутки экрана.
Мой источник данных подкачки выглядит следующим образом:
class GoogleBooksBookSource @Inject constructor( private val googleBooksRepository: GoogleBooksRepository, private val query: String ): PagingSourcelt;Int, Bookgt;() { override suspend fun load(params: LoadParamslt;Intgt;): LoadResultlt;Int, Bookgt; { val position = params.key ?: 0 return try { val response = googleBooksRepository.searchForBookStatic(query, position) if (response is Result.Success) { LoadResult.Page( data = response.data.items, prevKey = if (position == 0) null else position - 1, nextKey = if (response.data.totalItems == 0) null else position 1 ) } else { LoadResult.Error(Exception("Error loading paged data")) } } catch (e: Exception) { Log.e("PagingError", e.message.toString()) return LoadResult.Error(e) } } override fun getRefreshKey(state: PagingStatelt;Int, Bookgt;): Int? { return state.anchorPosition?.let { anchorPosition -gt; val anchorPage = state.closestPageToPosition(anchorPosition) anchorPage?.prevKey?.plus(1) ?: anchorPage?.nextKey?.minus(1) } } }
и это пользовательский интерфейс:
Column() { // other stuff LazyColumn( modifier = Modifier.padding(horizontal = 24.dp), content = { for (i in 0 until searchResults.itemCount) { searchResults[i]?.let { book -gt; item { BookCard( book = book, navigateToBookDetail = { navigateToBookDetail(book.id) } ) } } } } ) }
Насколько я могу судить, данные загружаются правильно и в правильном порядке, но когда я регистрирую URL-адреса запросов API, они совершают бесконечные вызовы с startIndex
каждым разом. Это было бы прекрасно, если бы я прокручивал, так как поиск в Google Книгах часто возвращает тысячи результатов, но он делает это, даже если я не прокручиваю экран.
Комментарии:
1. можно попробовать отладить и посмотреть
getRefreshKey()
, работает ли он все время? Я предполагаю, что ваш код верен, просто у этой функции, похоже, есть некоторые проблемы2.
getRefreshKey()
не вызывается повторно, ноload()
есть. Без меня, прокручивающего экран,state.anchorPosition
входonRefreshKey()
исчисляется сотнями
Ответ №1:
Проблема здесь заключалась в том, как я создавал элементы в LazyColumn
— он изначально поддерживает LazyPagingItem
, но я не использовал это. Вот рабочая версия:
LazyColumn( modifier = Modifier.padding(horizontal = 24.dp), state = listState, content = { items(pagedSearchResults) { book -gt; book?.let { BookCard( book = book, navigateToBookDetail = { navigateToBookDetail(book.id) } ) } } } )