千家信息网

Android Jetpack Compose无限加载列表的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文将为大家详细介绍"Android Jetpack Compose无限加载列表的示例分析",内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇"Android Jetpack
千家信息网最后更新 2026年11月02日Android Jetpack Compose无限加载列表的示例分析

本文将为大家详细介绍"Android Jetpack Compose无限加载列表的示例分析",内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇"Android Jetpack Compose无限加载列表的示例分析"能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去收获新知识吧。

    前言

    Android 中使用 ListView 或者 RecycleView 经常有滚动到底部自动 LoadMore 的需求,那么在 Compose 中该如何实现呢?

    两种方法可供选择:

    基于 paging-compose

    自定义实现

    方法一: paging-compose

    Jetpack 的 Paging 组件提供了对 Compose 的支持

    dependencies {    ...    // Paging Compose        implementation "androidx.paging:paging-compose:$latest_version"}

    Paging 的无限加载列表需要依靠 Paging 的 DataSource,我们创建一个 DataSource ,并在 ViewModel 中加载

    class MyDataSource(    privateval repo: MyRepository) : PagingSource() {    override suspend fun load(params: LoadParams): LoadResult {        return try {            val nextPage = params.key ?: 1            val response = repo.fetchData(nextPage)            LoadResult.Page(                data = response.results,                prevKey = if (nextPage == 1) null else nextPage - 1,                nextKey = repo.page.plus(1)            )        } catch (e: Exception) {            LoadResult.Error(e)        }    }}class MainViewModel(    repo: MyRepository) : ViewModel() {    val pagingData: Flow> = Pager(PagingConfig(pageSize = 20)) {        MyDataSource(repo)    }.flow}

    接下来在 Compose 使用 LazyColumn 或者 LazyRow 显示 Paging 的数据

    @Composablefun MyList(pagingData: Flow>) {    val listItems: LazyPagingItems = pagingData.collectAsLazyPagingItems()    LazyColumn {        items(listItems) {             ItemCard(data = it)        }    }}

    MyList 从 ViewModel 获取 Flow> 并通过 collectAsLazyPagingItems 转换成 Compose 的 State ,最终传递给 LazyColumn 内的 items 中进行展示。

    注意这里的 items(...) 是 paging-compose 中为 LazyListScope 定义的扩展方法,而非通常使用的 LazyListScope#items,

    public fun  LazyListScope.items(    items: LazyPagingItems,    key: ((item: T) -> Any)? = null,    itemContent: @Composable LazyItemScope.(value: T?) -> Unit) {        ...}

    它接受的参数类型是 LazyPagingItems, LazyPagingItems 在 get 时会判断是否滑动到底部并通过 Paging 请求新的数据,以此实现了自动加载。

    方法二:自定义实现

    如果你不想使用 Paging 的 DataSource,也可以自定义一个无限加载列表的 Composable

    @Composablefun list() {    val listItems = viewModel.data.observeAsState()    LazyColumn {        listItems.value.forEach { item ->            item { ItemCard(item) }            }        item {                 LaunchedEffect(Unit) {                        viewModel.loadMore()                }        }    }}

    当加载到最后一个 item 时,通过 LaunchedEffect 向 viewModel 请求新的数据。
    你也可以是用下面的方法,在抵达最后一个 item 之前,提前 loadmore,

    @Composablefun list() {    val listItems = viewModel.data.observeAsState()    LazyColumn {            itemsIndexed(listItmes) { index, item ->                    itemCard(item)                    LaunchedEffect(listItems.size) {                            if (listItems.size - index < 2) {                                    viewModel.loadMore()                            }                    }                }    }}

    如上,使用 itemsIndexed() 可以在展示 item 的同时获取当前 index,每次展示 item 时,都判断一下是否达到 loadMore 条件,比如代码中是当距离抵达当前列表尾部还有 2 个以内 item 。
    注意 LaunchedEffect 可能会随着每个 item 重组而执行,为 LaunchedEffect 增加参数 listItems.size 是为了确保对其在 item 上屏时只走一次。

    添加 LoadingIndicator

    如果想在 loadMore 时显示一个 LoadingIndicator, 可以实现代码如下

    @Composablefun list() {    val listItems = viewModel.data.observeAsState()    val isLast = viewModel.isLast.observeAsState()        LazyColumn {        listItems.value.forEach { item ->            item { ItemCard(item) }            }                if (isLast.value.not()) {                    item {                         LoadingIndicator()                        LaunchedEffect(Unit) {                                viewModel.loadMore()                        }                }                }    }}

    在展示最后一个 item 时,显示 LoadingIndicator() ,同时 loadMore(), 当没有数据可以加载时,不能再显示 LoadingIndicator,所以我们必须将 isLast 作为一个状态记录到 ViewModel 中,当然,你也可以将 viewModel.data 和 viewModel.isLast 等所有状态合并为一个 UiState 进行订阅。

    Android是什么

    Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

    如果你能读到这里,小编希望你对"Android Jetpack Compose无限加载列表的示例分析"这一关键问题有了从实践层面最深刻的体会,具体使用情况还需要大家自己动手实践使用过才能领会,如果想阅读更多相关内容的文章,欢迎关注行业资讯频道!

    方法 数据 示例 分析 内容 代码 参数 同时 手机 状态 实践 开放 不同 妥当 意想不到 接下来 操作系统 内核 前言 如上 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 喔噻互联网科技有限公司 华服互联网科技靠谱吗 哈尔滨大商圈互联网科技有限公司 互联网科技工作委员会主任 中关村互联网 科技集团 科技企业和互联网企业 互联网金融 科技 互联网与新科技 亿账通互联网科技 互联网科技公司名称 互联网科技有限公司 翻译 互联网金融监管科技 西藏七维空间互联网科技有限公司 互联网金融科技公司干啥的 互联网科技项目计划书材料类 想开互联网科技公司怎么样 智帮互联网科技公司最近动向 广州有谷有贝互联网科技有限公司 六子台科技互联网展会 互联网 科技节活动 微视频大赛 互联网加科技 河南真二互联网科技有限公司 互联网金融公司科技 礼当家互联网科技 重庆科技学院互联网 美国互联网前沿科技 金融科技与互联网金融相同和不同 互联网行业科技股 富国互联网科技002692 上海万顺科技互联网有限公司招聘
    0