如何记住使用 Paging 3 构建的 LazyColumn 的滚动位置

这将是一篇简短的文章,展示如何解决我在使用Jetpack Compose 1.2.1和导航撰写版本2.5.0构建此应用程序时发现的一个令人沮丧的问题。问题是LazyColumn无法“记住”其滚动位置,这意味着要转到列表的开头,导航到详细信息屏幕,然后返回主列表。我们都知道,这不是一个好的用户体验,这就是为什么我努力修复这个bug。这就是我遇到这个问题的原因,它概括了这个问题。

修复:有一个解决方法,如下所示并已解释:

@Composable
fun <T : Any> LazyPagingItems<T>.rememberLazyListState(): LazyListState {
    // After recreation, LazyPagingItems first return 0 items, then the cached items.
    // This behavior/issue is resetting the LazyListState scroll position.
    // Below is a workaround. More info: https://issuetracker.google.com/issues/177245496.
    return when (itemCount) {
        // Return a different LazyListState instance.
        0 -> remember(this) { LazyListState(0, 0) }
        // Return rememberLazyListState (normal case).
        else -> androidx.compose.foundation.lazy.rememberLazyListState()
    }
}

那么如何使用上述函数呢?如您所见,它是LazyPagingItems<T>类型的扩展函数,意味着您可以在MovieList.kt中如下使用它。应用程序中的kt文件链接。

@Composable
fun MovieList(
    movies: Flow<PagingData<Movie>>,
    modifier: Modifier,
    onMovieClick: (movie: Movie) -> Unit
) {

    val lazyMovieItems = movies.collectAsLazyPagingItems()

    val listState = lazyMovieItems.rememberLazyListState()

    LazyColumn(
        verticalArrangement = Arrangement.spacedBy(8.dp),
        modifier = modifier,
        state = listState
    ) {
        itemsIndexed(lazyMovieItems) { index, movie ->
            if (index == 0) {
                Spacer(modifier = Modifier.padding(4.dp))
            }
            MovieItem(
                movie = movie!!,
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(horizontal = 8.dp)
                    .clickable { onMovieClick(movie) }
            )
        }

... 
    }
}

如果这让您感到困惑,那么也许您可以为您的扩展功能使用不同的名称,但这将起到作用,直到 Google 发布修复程序。

快乐编码!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Paging3 是一个用于在 Android 应用中实现分页加载数据的开源库。它是 Google 官方发布的最新版本的 Paging 库,相较于以往的版本,Paging3 在实现简单、功能强大和性能优化方面有了很大的改进。 首先,Android Paging3 提供了强大的数据加载和显示机制。它通过将数据分割成固定大小的数据块 (page),并在需要时按需加载和展示数据,实现了无限滚动加载的效果。相较于传统的 RecyclerView 分页加载,Paging3 更加灵活,可以自动处理数据的加载和卸载,无需手动实现判断是否到底部、加载更多等繁琐逻辑。同时,Paging3 还支持局部刷新、数据源无缝替换等操作,让数据的加载和显示更加简单和高效。 其次,Paging3 在性能方面进行了优化。它使用了异步数据加载和显示机制,可以在后台线程上进行数据加载,不会阻塞主线程。同时,Paging3 采用了数据预加载和缓存策略,可以将下一页的数据提前加载到内存中,从而提高用户体验和应用的响应速度。并且,Paging3 还支持数据的持久化存储,可以将加载的数据缓存到本地数据库或文件中,避免了重复加载数据的开销。 最后,Paging3 还提供了丰富的扩展功能和灵活的定制选项。开发者可以自定义数据加载策略、数据源类型、数据显示方式等,以满足不同的业务需求。同时,Paging3 还提供了相关的辅助类和工具方法,帮助开发者更加便捷地实现数据的分页加载和显示。 总结来说,Android Paging3 是一个功能强大、性能优越的分页加载库,可以帮助开发者轻松实现数据的分页加载和显示,提高应用的用户体验和性能表现。无论是处理大量数据的列表页,还是实现无限滚动加载的功能,Paging3 都是一个值得推荐的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值