返回顶部
首页 > 资讯 > 精选 >Android Jetpack Compose无限加载列表的示例分析
  • 662
分享到

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

2023-06-26 06:06:26 662人浏览 泡泡鱼
摘要

本文将为大家详细介绍“Android Jetpack Compose无限加载列表的示例分析”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Android Jetpack 

本文将为大家详细介绍“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(    private val repo: MyRepository) : PagingSource<Int, MyData>() {    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, MyData> {        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<PagingData<MyData>> = Pager(PaginGConfig(pageSize = 20)) {        MyDataSource(repo)    }.flow}

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

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

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

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

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

    它接受的参数类型是 LazyPagingItems<T>, 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 Jetpack Compose无限加载列表的示例分析

    Android是什么

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

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

    --结束END--

    本文标题: Android Jetpack Compose无限加载列表的示例分析

    本文链接: https://lsjlt.com/news/307281.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Android Jetpack Compose无限加载列表的示例分析
      本文将为大家详细介绍“Android Jetpack Compose无限加载列表的示例分析”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Android Jetpack ...
      99+
      2023-06-26
    • Android端分页加载库的示例分析
      这篇文章主要介绍了Android端分页加载库的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言RecyclerView几乎在每个app里面都有被使用,但凡使用了列表...
      99+
      2023-06-14
    • Linux权限列中加号及点的示例分析
      这篇文章主要介绍了Linux权限列中加号及点的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、综述Linux中,ls -l命令可谓是最常用不过了。命令显示结果中的第...
      99+
      2023-06-27
    • java类加载的示例分析
      这篇文章将为大家详细讲解有关java类加载的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、说明当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过以下三个步骤对该类进行初始化。2、...
      99+
      2023-06-15
    • Bootstrap列表组的示例分析
      这篇文章主要介绍Bootstrap列表组的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!基础列表组基础列表组,看上去就是去掉了列表符号的列表项,并且配上一些特定的样式。在Bo...
      99+
      2024-04-02
    • python列表解析式的示例分析
      这篇文章给大家分享的是有关python列表解析式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。列表解析式比如我们有一系列水果的名字,存放在fruit列表里,如果我们希望把列表的内容都改成大写,我们可以有...
      99+
      2023-06-27
    • Android 使用RecycleView列表实现加载更多的示例代码
      目录1.界面布局2.功能实现 1.界面布局 <?xml version="1.0" encoding="utf-8"?> <FrameLayou...
      99+
      2024-04-02
    • 动态加载css的示例分析
      这篇文章给大家分享的是有关动态加载css的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、方法引用来源和应用此动态加载css方法 loadCss,剥离自Sea.js,并...
      99+
      2024-04-02
    • PHP中类加载的示例分析
      这篇“PHP中类加载的示例分析”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“PHP中类加载的示例分析”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入主题吧。...
      99+
      2023-06-06
    • java类加载器的示例分析
      这篇文章给大家分享的是有关java类加载器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布...
      99+
      2023-06-14
    • Redis压缩列表的示例分析
      这篇文章主要介绍了Redis压缩列表的示例分析,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。此篇文章是主要介绍Redis在数据存储方面的其中一种...
      99+
      2024-04-02
    • CSS列表属性的示例分析
      这篇文章主要介绍了CSS列表属性的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 CSS 列表 从某种含意上讲,不是描摹性的文本...
      99+
      2024-04-02
    • Bootstrap中列表组的示例分析
      这篇文章主要介绍了Bootstrap中列表组的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。列表组是Bootstrap框架新增的一个组件,可以用来制作列表清单、垂直导...
      99+
      2023-06-14
    • html有序列表的示例分析
      小编给大家分享一下html有序列表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有序列表用数字进行标记。列表始于 <ol> 标签。每个列表项...
      99+
      2023-06-17
    • VB.NET对象列表的示例分析
      小编给大家分享一下VB.NET对象列表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一步步是要创建一个同用列表,你可以从多种途径获取数据,但是最简单的...
      99+
      2023-06-17
    • Android自定义仿ios加载弹窗的示例分析
      小编给大家分享一下Android自定义仿ios加载弹窗的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下效果如下:IosLoadDialog类(可直接复制):public class ...
      99+
      2023-06-15
    • Android 资源加载使用伪代码示例分析
      目录引言Resource是什么?基础概念getTextgetDrawable小结TipsgetColor总结引言 聊到 Android 的 资源加载 ,每一个开发同学都会非常熟悉,毕...
      99+
      2022-11-13
      Android 资源加载 Android 加载
    • Android的Activity加载方式实例分析
      本文实例分析了Android的Activity加载方式。分享给大家供大家参考,具体如下: 前面分析过Android中activity的加载方式(参考前面一篇《Android编程...
      99+
      2022-06-06
      activity Android
    • javascript模块加载器的示例分析
      这篇文章将为大家详细讲解有关javascript模块加载器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。定义var MyModules =&...
      99+
      2024-04-02
    • CommonJS中模块加载的示例分析
      这篇文章主要介绍CommonJS中模块加载的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!叨叨一会CommonJSCommon这个英文单词的意思,相信大家都认识,我记得有一个...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作