Библиотека Android подкачки 3 загружается бесконечно без прокрутки с помощью Jetpack Compose

#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) }  )  }  }  } )