Android Paging 3 库使用 Jetpack Compose 无限加载,无需滚动

问题描述 投票:0回答:3

我正在尝试使用 Jetpack Compose 和 Android 的 Paging 3 库制作分页书籍列表。我能够制作分页列表并获取数据,但是我的分页数据源的

load()
函数被无限调用,而无需我滚动屏幕。

我的分页数据源如下所示:

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 图书搜索通常会返回数千个结果,但即使我不滚动屏幕它也会这样做。

android kotlin android-jetpack-compose android-jetpack android-paging
3个回答
1
投票

这里的问题是我在

LazyColumn
中创建元素的方式 - 它本身支持
LazyPagingItem
但我没有使用它。这是工作版本:

LazyColumn(
    modifier = Modifier.padding(horizontal = 24.dp),
    state = listState,
    content = {
        items(pagedSearchResults) { book ->
            book?.let {
                BookCard(
                    book = book,
                    navigateToBookDetail = { navigateToBookDetail(book.id) }
                )
            }
        }
    }
)

0
投票

在您的原始示例中,您必须使用 peek 检查非空并访问列表,就像仅在 inside 项目块中一样,这是懒惰的。否则分页功能将会丢失,并且会一次性加载整个数据集。


0
投票

接受的答案
中的items方法已从 paging-compose 库的 3.2.0 版本中弃用(changelog)。您应该使用如下所示的内容:

items(
    count = pagedSearchResults.itemCount,
    key = pagedSearchResults.itemKey {  /* Your Key */ },
    contentType = pagedSearchResults.itemContentType { /* Your ContentType */ }
) {
    /* Content */
}

其中

itemKey
itemContentType
是 paging-compose 库中的扩展函数。

© www.soinside.com 2019 - 2024. All rights reserved.