[英]Android Paging 3 library loading infinitely without scroll with Jetpack Compose
我正在嘗試使用 Jetpack Compose 和 Android 的 Paging 3 庫制作一個分頁的圖書列表。 我能夠制作分頁列表並獲得數據,但是我的分頁數據源的load()
function 被無限調用,而無需滾動屏幕。
我的分頁數據源如下所示:
class GoogleBooksBookSource @Inject constructor(
private val googleBooksRepository: GoogleBooksRepository,
private val query: String
): PagingSource<Int, Book>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Book> {
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: PagingState<Int, Book>): Int? {
return state.anchorPosition?.let { anchorPosition ->
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 ->
item {
BookCard(
book = book,
navigateToBookDetail = { navigateToBookDetail(book.id) }
)
}
}
}
}
)
}
據我所知,數據以正確的順序正確加載,但是當我記錄 API 請求 URL 時,它會進行無限調用,每次調用的startIndex
都會增加。 如果我正在滾動,那會很好,因為 Google Books 搜索通常會返回數千個結果,但即使我不滾動屏幕,它也會這樣做。
這里的問題是我在LazyColumn
中創建元素的方式 - 它本身支持LazyPagingItem
但我沒有使用它。 這是工作版本:
LazyColumn(
modifier = Modifier.padding(horizontal = 24.dp),
state = listState,
content = {
items(pagedSearchResults) { book ->
book?.let {
BookCard(
book = book,
navigateToBookDetail = { navigateToBookDetail(book.id) }
)
}
}
}
)
在您的原始示例中,您必須使用peek檢查非空並訪問列表,就像您只在項目塊內所做的那樣,這是惰性的。 否則分頁功能將丟失,它將在一個 go 中加載整個數據集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.