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案例——消息的订阅与…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
