Compose - 使用 Paging
一、添加依赖
查看官方最新版本
val paging_version = "3.2.1"
implementation("androidx.paging:paging-runtime:$paging_version")
implementation("androidx.paging:paging-compose:$paging_version")
二、定义数据源 PagingSource
是对其它数据源的封装,因此和 Repository 定义在同一个 .kt 文件中并私有化。自定义一个类继承 PagingSource 并重写 load() 来提供获取页面数据。
class DemoRepository {fun getData() = Pager(PagingConfig(10)) {PagingResource()}.flow
}private class PagingResource : PagingSource<Int, HotNewestArticleBean.HotNewestArticle.Article>() {private val startPage = 0override suspend fun load(params: LoadParams<Int>): LoadResult<Int, HotNewestArticleBean.HotNewestArticle.Article> {return try {val currentPage = params.key ?: startPageval data = getData(currentPage)val prevKey = if (currentPage > startPage) currentPage - 1 else nullval nextKey = if (data.isNotEmpty()) currentPage + 1 else nullLoadResult.Page(data, prevKey, nextKey)} catch (e: Exception) {LoadResult.Error(e)}}override fun getRefreshKey(state: PagingState<Int, HotNewestArticleBean.HotNewestArticle.Article>): Int? {return null}//具体获取数据的方法。这里能更细分的对异常处理,否则在load()中合并返回后在UI中难区分。//但处理后还是要抛出异常,不然load()不会返回异常,影响UI中对Paging状态判断private suspend fun getData(currentPage: Int): List<HotNewestArticleBean.HotNewestArticle.Article> {var data: List<HotNewestArticleBean.HotNewestArticle.Article> = emptyList()runCatching {withContext(Dispatchers.IO) {RetrofitClient.apiService.newestArticle(currentPage.toString())}}.onSuccess { response ->response.getData().onSuccess {data = it.datas}.onFailure {Log.e("服务器错误", it.message.toString())throw Exception("服务器错误:${it.message}")}}.onFailure {Log.e("本地错误", it.message.toString())throw Exception("本地错误:${it.message}")}return data}
}
三、ViewModel 中调用
class DemoViewModel : ViewModel() {private val repository = DemoRepository()var pagingDataFlow = repository.getData().cachedIn(viewModelScope) //缓存在ViewModel中
}
四、UI
@Composable
fun DemoScreen(viewModel: DemoViewModel = viewModel()
) {//将Paging的数据从Flow转为可供LazyColumn使用的val lazyPagingItems = viewModel.pagingDataFlow.collectAsLazyPagingItems()//监听Paging状态when (lazyPagingItems.loadState.refresh) {//正在加载is LoadState.Loading -> {}//加载错误(这里的错误是PagingSource里捕获的)is LoadState.Error -> {}//当没有加载动作并且没有错误的时候is LoadState.NotLoading -> {}}LazyColumn(modifier = Modifier.fillMaxSize(),state = lazyListState){items(count = lazyPagingItems.itemCount,key = lazyPagingItems.itemKey { it.id }) { index ->val bean = lazyPagingItems[index]if (bean != null) {val author = bean.authorval shareUser = bean.shareUserval superChapterName = bean.superChapterNameItem(title = bean.title,author = if (author.isEmpty()) String.format("%s · %s", superChapterName, shareUser) else String.format("%s · %s", superChapterName, author),time = bean.niceDate,)} else {Text("")}}}
}
相关文章:
Compose - 使用 Paging
一、添加依赖 查看官方最新版本 val paging_version "3.2.1" implementation("androidx.paging:paging-runtime:$paging_version") implementation("androidx.paging:paging-compose:$paging_version") 二、定义数据源 PagingSource 是对其它…...
数据结构与算法-(11)---有序表(OrderedList)
🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON学习系列专栏 💫"没有罗马,那就自己创造罗马~" 目录 知识回顾及总结 有序表的引入 编辑 实现有序表 1.有序表-类的构造方法 2.有序表-search方法的实现 3.有序表-add方法的实现…...
佳易王会员管理系统软件如何下载,基本功能有哪些
一、佳易王会员管理软件大众版 部分功能简介: 1、会员信息登记 :可以直接使用手机号登记,也可以使用实体卡片,推荐用手机号即可。 2、会员卡类型 :可以自由设置卡的类型,比如:充值卡、计次卡、…...
docker搭建mysql环境
1. 基础环境 名称描述CentOS 7.6Linux操作系统版本docker 20.10.5docker版本mysql 8.0.29mysql镜像版本 2. 下载安装 使用docker命令下载mysql镜像 [rootzhouwei ~]# docker pull mysql:8.0.29查看docker仓库是否已经下载了mysql镜像 [rootzhouwei ~]# docker images将mys…...
优思学院|推行精益六西格玛困难重重?7大原因分析助你避坑
六西格玛,是一种让企业在绩效管理的舞台上跳得更高更远的方法。它不仅仅是一套原则和技术,更是一种对完美的执着追求。 在这个舞台上,企业的流程管理得以严格、集中,质量得以高效提升。优思学院总结出六西格玛的核心是࿱…...
四川思维跳动商务信息咨询有限公司可信吗?
在今天的数字化时代,抖音带货已成为一种全新的商业模式。许多公司都在通过这种形式进行产品推广和销售,其中,四川思维跳动商务信息咨询有限公司以其专业的服务和良好的信誉,在抖音带货领域赢得了广泛赞誉。 四川思维跳动商务信息…...
高防CDN与高防服务器:谁更胜一筹?
在当今数字化世界中,网络安全对于保护网站和应用程序至关重要。在这一背景下,高防CDN和高防服务器是两种流行的解决方案,用于应对不同类型的网络攻击。本文将分析高防CDN是否能够替代高防服务器,以及它们各自的优势和限制。 高防C…...
2.Netty简单应用
引入Maven依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId><version>4.1.49.Final</version> </dependency>服务端的管道处理器 public class NettyServerHandler extends ChannelInbou…...
80个10倍提升Excel技能的ChatGPT提示
你是否厌倦了在使用Excel时感觉像个新手?你是否想将你的技能提升到更高的水平,成为真正的Excel大师?嗯,如果你正在使用ChatGPT,那么成为Excel专家简直易如反掌。 你只需要了解一些最有用的Excel提示,就能在…...
jenkins结合k8s部署动态slave
1、完成k8s连接 在完成jenkins的部署后现安装kubernets的插件 如果jenkins 是部署在k8s集群中只需要填写一下 如果是非本集群的部署则需要填写证书等 cat ./config echo ‘certificate-authority-data-value’ | base64 -d > ./ca.crt echo ‘client-certificate-data’ |…...
搜索引擎Elasticsearch基础与实践
倒排索引 将文档中的内容分词,然后形成词条。记录每条词条与数据的唯一表示如id的对应关系,形成的产物就是倒排索引,如下图: ElasticSearch数据的存储和搜索原理 这里的索引库相当于mysql中的database。一个文档(do…...
vue项目electron打包
1.设置国内镜像 npm config edit 命令行输入后会弹出npm的配置文档,需要文档末尾加入 electron_mirrorhttps://npm.taobao.org/mirrors/electron/ electron-builder-binaries_mirrorhttps://npm.taobao.org/mirrors/electron-builder-binaries/ 2.全局安装electron …...
英伟达发布RAPIDS cuDF框架 pandas在GPU上运行速度快了150倍
11月9日 消息:Nvidia 发布了一款名为 RAPIDS cuDF 的新版本,据称可以将 pandas 运行在 GPU 上,并且性能提升了150倍。pandas 是一款流行的基于 Python 的数据框架库,用于数据处理和分析。它的开源版本由 Wes McKinney 开发和发布&…...
(a)Mask RCNN总体流程
(a)Mask RCNN总体流程 一.Mask RCNN 架构 自己整理了一份Mask RCNN架构图如下,其中绿色模块只有推理过程才会涉及。 核心模块包括:数据预处理,骨干网络,区域提议网络,FastRCNN分支,…...
浅谈数据中心机房末端配电技术与产品监控选型-安科瑞黄安南
摘要 数据中心机房末端配电的可靠性、稳定性和可维护性直接关系到IT设备的安全供电。数据中心的末端配电技术主要有两种,一种采用列头柜加电缆配电,另一种是智能小母线配电。分别对两种配电技术进行了介绍和探讨,最后对两种配电方式进行了对…...
红包算法 java实现
红包算法 首先,如果红包只有一个,本轮直接使用全部金额,确保红包发完。 然后, 计算出本次红包最少要领取多少,才能保证红包领完,即本轮下水位; 本轮最多领取多少,才能保证每个人都…...
MVCC中的可见性算法
在之前的文章 MVCC详解-CSDN博客中我们已经介绍过了MVCC的原理(read viewundo log),今天来详细的说一下readview的匹配规则(可见性算法) 隔离级别在RC,RR的前提下 Read View是如何保证可见性判断的呢&#…...
Leetcode73矩阵置零
1110-3 代码: 和题解思路差不多 class Solution {public void setZeroes(int[][] matrix) {Set<Integer> setr new HashSet<>();Set<Integer> setc new HashSet<>();for(int i0;i<matrix.length;i){for(int j0;j<matrix[0].leng…...
linux重要的目录之proc和dev目录
/proc/目录 虚拟文件系统,将内核与进程状态归档为文本文件(系统信息都存放这目录下) Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟…...
【组件自定义事件+全局事件总线+消息订阅与发布+TodoList案例——编辑+过度与动画】
组件自定义事件全局事件总线消息订阅与发布TodoList案例——编辑过度与动画 1 组件自定义事件1.1 绑定1.2 解绑1.3 总结1.4 TodoList案例——自定义事件 2 全局事件总线2.1 理解2.2 步骤2.3 TodoList案例——事件总线 3 消息订阅与发布3.1 理解3.2 TodoList案例——消息的订阅与…...
【2024最硬核VS Code生产力升级】:用Copilot Next实现代码生成→测试生成→部署脚本自动生成闭环(附可运行配置仓库)
更多请点击: https://intelliparadigm.com 第一章:Copilot Next核心能力与工作流闭环全景图 Copilot Next 不再是单一的代码补全工具,而是深度嵌入开发全生命周期的智能协作者。它通过统一语义理解层连接需求分析、设计建模、编码实现、测试…...
Verdi FSDB转VCD波形保姆级教程:解决PrimeTime PX功耗分析兼容性问题
Verdi FSDB转VCD波形全流程指南:突破PrimeTime PX兼容性壁垒 在芯片设计验证流程中,功耗分析是确保设计可靠性的关键环节。许多工程师都遇到过这样的困境:使用最新版Verdi生成的FSDB波形文件无法被老版本的PrimeTime PX或Encounter功耗分析工…...
MCP插件生态搭建全链路拆解,覆盖协议注册、能力协商、上下文同步与热重载调试
更多请点击: https://intelliparadigm.com 第一章:MCP插件生态搭建全景概览 MCP(Model Control Protocol)作为新一代模型交互协议,其插件生态是实现大模型能力可扩展、可编排与可治理的核心基础设施。插件并非孤立模块…...
键盘幽灵键终结者:Keyboard Chatter Blocker深度配置指南
键盘幽灵键终结者:Keyboard Chatter Blocker深度配置指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 当你的机械键盘开始…...
专用预训练模型:垂直领域的高效AI解决方案
1. 项目概述:专用预训练模型的必要性 在深度学习领域,我们正面临一个有趣的悖论:通用基础模型(如GPT、CLIP)的能力越来越强,但实际落地时却常常遇到效率瓶颈。去年我在部署一个工业质检项目时,发…...
Python新手必看:遇到‘utf-8‘解码失败别慌,这3个排查步骤帮你搞定(附requests库实战)
Python编码问题实战:从SyntaxError到数据处理的完整解决方案 刚接触Python处理文本数据时,看到终端突然抛出SyntaxError: (unicode error) utf-8 codec cant decode byte 0xa3 in position 15: invalid start这样的错误信息,很多新手会感到手…...
解锁明日方舟视觉宝库:2000+高清游戏素材的完整创作指南
解锁明日方舟视觉宝库:2000高清游戏素材的完整创作指南 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 在游戏开发、二次元创作和视觉设计领域,高质量的游戏素材…...
K-Means聚类效果总不好?试试在Scikit-learn里用标准化欧氏距离优化你的模型
K-Means聚类效果总不好?试试在Scikit-learn里用标准化欧氏距离优化你的模型 当你在电商用户分群项目中遇到这样的场景:消费金额(0-10000元)和登录次数(1-100次)两个特征被放在同一个聚类模型里,…...
如何将视频压缩到极小尺寸:CompressO开源跨平台工具的终极指南
如何将视频压缩到极小尺寸:CompressO开源跨平台工具的终极指南 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/com…...
# CentOS 7 + 中国服务器 + Codex + 中转 API 完整教程
CentOS 7 中国服务器 Codex 中转 API 完整教程 适用场景: 国内云服务器无法直连 OpenAI系统为 CentOS 7希望稳定使用 Codex CLI 这篇文章把安装、配置、避坑和最终可用方案一次讲清楚,适合直接照着操作。 一、先说核心问题 很多人在 CentOS 7 上安装 …...
