HarmonyOS:使用Refresh组件实现页面下拉刷新上拉加载更多
一、前言
可以进行页面下拉操作并显示刷新动效的容器组件。
说明
- 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
- 该组件从API Version 12开始支持与垂直滚动的Swiper和Web的联动。当Swiper设置loop属性为true时,Refresh无法和Swiper产生联动。
二、子组件
支持单个子组件。
从API version 11开始,Refresh子组件会跟随手势下拉而下移。
三、接口
Refresh(value: RefreshOptions)
创建Refresh容器。
参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| value | RefreshOptions | 是 | 刷新组件参数。 |
四、属性
支持通用属性外,还支持以下属性:
refreshOffset12+
refreshOffset(value: number)
设置触发刷新的下拉偏移量,当下拉距离小于该属性设置值时离手不会触发刷新。
参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| value | number | 是 | 下拉偏移量,单位vp。 默认值:未设置promptText参数时为64vp,设置了promptText参数时为96vp。 如果取值为0或负数的时候此接口采用默认值。 |
pullToRefresh12+
pullToRefresh(value: boolean)
设置当下拉距离超过refreshOffset时是否能触发刷新。
元服务API: 从API version 12开始,该接口支持在元服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| value | boolean | 是 | 当下拉距离超过refreshOffset时是否能触发刷新。true表示能触发刷新,false表示不能触发刷新。 默认值:true |
五、事件
除支持通用事件外,还支持以下事件:
onStateChange
onStateChange(callback: (state: RefreshStatus) => void)
当前刷新状态变更时,触发回调。
元服务API: 从API version 11开始,该接口支持在元服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| state | RefreshStatus | 是 | 刷新状态。 |
onRefreshing
onRefreshing(callback: () => void)
进入刷新状态时触发回调。
元服务API: 从API version 11开始,该接口支持在元服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
onOffsetChange12+
onOffsetChange(callback: Callback)
下拉距离发生变化时触发回调。
元服务API: 从API version 12开始,该接口支持在元服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| callback | Callback | 是 | 下拉距离。 单位:vp |
RefreshStatus枚举说明
Refresh刷新状态枚举。
元服务API: 从API version 11开始,该接口支持在元服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
| 名称 | 值 | 说明 |
|---|---|---|
| Inactive | 0 | 默认未下拉状态。 |
| Drag | 1 | 下拉中 |
| OverDrag | 2 | 下拉中,下拉距离超过刷新距离。 |
| Refresh | 3 | 下拉结束,回弹至刷新距离,进入刷新中状态。 |
| Done | 4 | 刷新结束,返回初始状态(顶部)。 |
六、示例
6.1 示例(默认刷新样式)
刷新区域使用默认刷新样式。效果图如下
TestRefreshExample1.ets代码
@Entry
@Component
struct TestRefreshExample1 {@State isRefreshing: boolean = false@State arr: String[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']build() {Column() {Refresh({ refreshing: $$this.isRefreshing }) {List() {ForEach(this.arr, (item: string) => {ListItem() {Text('' + item).width('70%').height(80).fontSize(16).margin(10).textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)}}, (item: string) => item)}.onScrollIndex((first: number) => {console.info(first.toString())}).width('100%').height('100%').alignListItem(ListItemAlign.Center).scrollBar(BarState.Off)}.onStateChange((refreshStatus: RefreshStatus) => {console.info('Refresh onStatueChange state is ' + refreshStatus)}).onOffsetChange((value: number) => {console.info('Refresh onOffsetChange offset:' + value)}).onRefreshing(() => {setTimeout(() => {this.isRefreshing = false}, 2000)console.log('onRefreshing test')}).backgroundColor(0x89CFF0).refreshOffset(64).pullToRefresh(true)}}
}
6.2 示例(设置刷新区域显示文本)
通过promptText参数设置刷新区域显示文本。
TestRefreshExample2.ets代码
@Entry
@Component
struct TestRefreshExample2 {@State isRefreshing: boolean = false@State promptText: string = "Refreshing..."@State arr: String[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']build() {Column() {Refresh({ refreshing: $$this.isRefreshing, promptText: this.promptText }) {List() {ForEach(this.arr, (item: string) => {ListItem() {Text('' + item).width('70%').height(80).fontSize(16).margin(10).textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)}}, (item: string) => item)}.onScrollIndex((first: number) => {console.info(first.toString())}).width('100%').height('100%').alignListItem(ListItemAlign.Center).scrollBar(BarState.Off)}.backgroundColor(0x89CFF0).pullToRefresh(true).refreshOffset(96).onStateChange((refreshStatus: RefreshStatus) => {console.info('Refresh onStatueChange state is ' + refreshStatus)}).onOffsetChange((value: number) => {console.info('Refresh onOffsetChange offset:' + value)}).onRefreshing(() => {setTimeout(() => {this.isRefreshing = false}, 2000)console.log('onRefreshing test')})}}
}
6.3 示例(自定义刷新区域显示内容-builder)
通过builder参数自定义刷新区域显示内容。
TestRefreshExample3.ets代码
@Entry
@Component
struct TestRefreshExample3 {@State isRefreshing: boolean = false@State arr: string[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']@BuildercustomRefreshComponent() {Stack() {Row() {LoadingProgress().height(32)Text("Refreshing...").fontSize(16).margin({ left: 20 })}.alignItems(VerticalAlign.Center)}.align(Alignment.Center).clip(true)// 设置最小高度约束保证自定义组件高度随刷新区域高度变化时自定义组件高度不会低于minHeight.constraintSize({ minHeight: 32 }).width("100%")}build() {Column() {Refresh({ refreshing: $$this.isRefreshing, builder: this.customRefreshComponent() }) {List() {ForEach(this.arr, (item: string) => {ListItem() {Text('' + item).width('70%').height(80).fontSize(16).fontColor(Color.Black).textAlign(TextAlign.Center).margin(10).borderRadius(10).backgroundColor(0xFFFFFF)}}, (item: string) => item)}.onScrollIndex((start: number, end: number) => {console.log(`当前滚动的 index start = ${start} end = ${end}`)}).alignListItem(ListItemAlign.Center).scrollBar(BarState.Off)}.backgroundColor(0x89CFF0).pullToRefresh(true) // 设置当下拉距离超过refreshOffset时是否能触发刷新。true表示能触发刷新, 默认值:true.refreshOffset(64) // 下拉偏移量,单位vp。默认值:未设置promptText参数时为64vp,设置了promptText参数时为96vp。 如果取值为0或负数的时候此接口采用默认值。.onStateChange((refreshStatus: RefreshStatus) => {console.log(`当前刷新状态回调 onStatueChange state is ${refreshStatus}`)}).onRefreshing(() => {setTimeout(() => {this.isRefreshing = false;console.log("停止刷新")}, 2000)console.log("onRefreshing 测试")})}}
}
6.4 示例(实现下拉刷新上拉加载更多)
Refresh组件与List组件组合实现下拉刷新上拉加载更多效果。
TestListRefreshLoad.ets代码
@Entry
@Component
struct TestListRefreshLoad {@State arr: Array<number> = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];@State refreshing: boolean = false;@State refreshOffset: number = 0;@State refreshState: RefreshStatus = RefreshStatus.Inactive;@State isLoading: boolean = false;@BuilderrefreshBuilder() {Stack({ alignContent: Alignment.Bottom }) {// 可以通过刷新状态控制是否存在Progress组件// 当刷新状态处于下拉中或刷新中状态时Progress组件才存在if (this.refreshState != RefreshStatus.Inactive && this.refreshState != RefreshStatus.Done) {Progress({ value: this.refreshOffset, total: 64, type: ProgressType.Ring }).width(32).height(32).style({ status: this.refreshing ? ProgressStatus.LOADING : ProgressStatus.PROGRESSING }).margin(10)}}.clip(true).height("100%").width("100%")}@Builderfooter() {Row() {LoadingProgress().height(32).width(48)Text("加载中")}.width("100%").height(64).justifyContent(FlexAlign.Center)// 当不处于加载中状态时隐藏组件.visibility(this.isLoading ? Visibility.Visible : Visibility.Hidden)}build() {Refresh({ refreshing: $$this.refreshing, builder: this.refreshBuilder() }) {List() {ForEach(this.arr, (item: number) => {ListItem() {Text('' + item).width('100%').height(80).fontSize(16).textAlign(TextAlign.Center).backgroundColor(0xFFFFFF)}.borderWidth(1)}, (item: string) => item)ListItem() {this.footer();}}.onScrollIndex((start: number, end: number) => {// 当达到列表末尾时,触发新数据加载if (end >= this.arr.length - 1) {this.isLoading = true;// 模拟新数据加载setTimeout(() => {for (let i = 0; i < 10; i++) {this.arr.push(this.arr.length);this.isLoading = false;}}, 700)}}).scrollBar(BarState.Off)// 开启边缘滑动效果.edgeEffect(EdgeEffect.Spring, { alwaysEnabled: true })}.width('100%').height('100%').backgroundColor(0xDCDCDC).onOffsetChange((offset: number) => {this.refreshOffset = offset;}).onStateChange((state: RefreshStatus) => {this.refreshState = state;}).onRefreshing(() => {// 模拟数据刷新setTimeout(() => {this.refreshing = false;}, 2000)})}
}
相关文章:
HarmonyOS:使用Refresh组件实现页面下拉刷新上拉加载更多
一、前言 可以进行页面下拉操作并显示刷新动效的容器组件。 说明 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件从API Version 12开始支持与垂直滚动的Swiper和Web的联动。当Swiper设置loop属性为true时&…...
获取印度股票市场列表、查询IPO信息以及通过WebSocket实时接收数据
为了对接印度股票市场,获取市场列表、查询IPO信息、查看涨跌排行榜以及通过WebSocket实时接收数据等步骤。 1. 获取市场列表 首先,您需要获取支持的市场列表,这有助于了解哪些市场可以交易或监控。 请求方法:GETURL:…...
【C++深入系列】:模版详解(上)
🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 你不需要很厉害才能开始,但你需要开始才能很厉害。 ★★★ 本文前置知识: 类和对象(上) …...
leetcode刷题日记——同构字符串
[ 题目描述 ]: [ 思路 ]: 题目要求判断 s 和 t 是否为同构字符串,即 s 中每个字符与 t 中对应位置的字符形成一个映射关系,且只能是一对一映射ASCII(American Standard Code for Information Interchange)…...
HTTP/1.1 队头堵塞问题
文章目录 一、队头堵塞1、非管线化2、管线化 二、如何解决? 一、队头堵塞 1、非管线化 如图,http 请求必须等到上一个请求响应后才能发送,后面的以此类推,由此可以看出,在一个 tcp 通道中,如果某个 http 请…...
【Quest开发】在虚拟世界设置具有遮挡关系的透视窗口
软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 仅针对urp管线 参考了YY老师这篇,可以先看他的再看这个可能更好理解一些:Unity Meta Quest MR 开发(七):使…...
Qt界面卡住变慢的解决方法
本质原因: 当Qt界面出现卡顿或无响应时,通常是因为主线程(GUI线程)被耗时操作阻塞。 完全忘了。。。 Qt Creater解决方法 1. 定位耗时操作 目标:找到阻塞主线程的代码段。 方法: 使用QElapsedTimer测量代码执行时间…...
常用 Git 命令详解
Git 是一个强大的版本控制工具,广泛用于软件开发和团队协作中。掌握 Git 命令可以帮助开发者更高效地管理代码版本和项目进度。本文将介绍一些常用的 Git 命令,并提供示例以帮助你更好地理解和应用这些命令。 目录 常用命令 git clonegit stashgit pul…...
java导出word含表格并且带图片
背景 我们需要通过 Java 动态导出 Word 文档,基于预定义的 模板文件(如 .docx 格式)。模板中包含 表格,程序需要完成以下操作: 替换模板中的文本(如占位符 ${设备类型} 等)。 替换模板中的图…...
基于CNN卷积神经网络和GEI步态能量提取的视频人物步态识别算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 GEI步态能量提取 4.2 CNN卷积神经网络原理 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b/matlab2022a 3.部分核心程序 &…...
【Pandas】pandas DataFrame isin
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...
算法思想之链表
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之链表 发布时间:2025.4.18 隶属专栏:算法 目录 算法介绍常用技巧 例题两数相加题目链接题目描述算法思路代码实现 两两交换链表中的节点题目链接题目描述算法思路代码实现 重排链表…...
Oceanbase单机版上手示例
本月初Oceanbase单机版发布,作为一个以分布式起家的数据库,原来一个集群动辄小十台机器,多着十几台几十台甚至更多,Oceanbase单机版的发布确实大大降低了硬件部署的门槛。 1.下载安装介质 https://www.oceanbase.com/softwarece…...
架构师面试(三十二):注册中心数据结构
问题 提到【注册中心】,我们对它的基本功能,肯定可以顺手拈来,比如:【服务注册】【服务发现】【健康检查】【变更通知】等。 透过这些基本功能,一个普适的注册中心的数据结构应该如何设计呢? 可以结合着…...
《软件设计师》复习笔记(11.5)——测试原则、阶段、测试用例设计、调试
目录 1. 测试基础概念 2. 测试方法分类 3. 测试阶段 真题示例: 题目1 题目2 题目3 4. 测试策略 5. 测试用例设计 真题示例: 6. 调试与度量 真题示例: 1. 测试基础概念 定义:系统测试是为发现错误而执行程序的过程&…...
闲来无事,用HTML+CSS+JS打造一个84键机械键盘模拟器
今天闲来无聊,突发奇想要用前端技术模拟一个机械键盘。说干就干,花了点时间搞出来了这么一个有模有样的84键机械键盘模拟器。来看看效果吧! 升级版的模拟器 屏幕录制 2025-04-18 155308 是不是挺像那么回事的?哈哈! 它…...
23种设计模式全面解析
设计模式是解决软件设计中常见问题的经典方案。根据《设计模式:可复用面向对象软件的基础》(GoF),23种设计模式分为以下三类: 一、创建型模式(5种) 目标:解耦对象的创建过程&#x…...
Java学习手册:常见并发问题及解决方案
在Java并发编程中,开发者常常会遇到各种并发问题,这些问题可能导致程序行为不可预测、性能下降甚至程序崩溃。以下是一些常见的并发问题及其解决方案: 1.竞态条件(Race Condition) 竞态条件是指多个线程同时访问共享…...
【免费下载】中国各省市地图PPT,可编辑改颜色
很多同学做PPT时,涉及到中国地图或省份展示,自己绘制和调色难度大,下面为大家准备了中国地图的可编辑模板,可以根据PPT整体色或想突出的省份,直接调整颜色。 需要这份数据,请在文末查看下载方法。 一、数…...
Linux 系统编程 day4 进程管道
进程间通信(IPC) Linux环境下,进程地址空间相互独立,任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能互相访问,要交换数据必须通过内核,在内核中开辟一块缓冲区…...
【Reading Notes】(8.2)Favorite Articles from 2025 February
【February】 高阶智驾别被短期市占率迷住眼!(2025年02月01日) 2024年,高阶智驾发展迅猛,粗略计算中国市场(特斯拉之外)的城市NOA车型的年度搭载量超过了100万台。但相比于中国乘用车市场2000万…...
探索大语言模型(LLM):循环神经网络的深度解析与实战(RNN、LSTM 与 GRU)
一、循环神经网络(RNN) 1.1 基本原理 循环神经网络之所以得名,是因为它在处理序列数据时,隐藏层的节点之间存在循环连接。这意味着网络能够记住之前时间步的信息,并利用这些信息来处理当前的输入。 想象一下…...
山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到
在开发中医知识问答历史对话查看功能的时候,出现了前后端信息获取异同的问题,在经过非常非常非常艰难的查询之后终于解决了这一问题,而这一问题的罪魁祸首就是后端没有setter和getter方法!!!!&a…...
poj1067 取石子游戏 威佐夫博弈
题目 有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法, 一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者…...
优先级队列的实模拟实现
优先级队列底层默认用的是vector来存储数据,实现了类似我们数据结构中学习过的堆的队列,他的插入和删除都是优先级高先插入和删除。下面我们来模拟实现它们常见的接口来熟悉优先级队列。 仿函数 在介绍优先级队列之前,我们先熟悉一个概念&a…...
中国高校光芯片技术进展:前沿突破与产业化路径分析——基于材料、集成与系统协同创新的视角
引言:光电子技术的范式变革 随着摩尔定律逼近物理极限,光芯片技术成为突破电子芯片性能瓶颈的核心路径。光芯片以光子为载体,在传输速率(>100 Gbps)、能耗效率(<1 pJ/bit)及抗电磁干扰等…...
swagger 导入到apipost中
打开swagger json链接 保存到本地转为json格式文件 上传文件就行...
网安加·百家讲坛 | 刘志诚:AI安全风险与未来展望
作者简介:刘志诚,乐信集团信息安全中心总监、OWASP广东区域负责人、网安加社区特聘专家。专注于企业数字化过程中网络空间安全风险治理,对大数据、人工智能、区块链等新技术在金融风险治理领域的应用,以及新技术带来的技术风险治理…...
熵权法+TOPSIS+灰色关联度综合算法(Matlab实现)
熵权法TOPSIS灰色关联度综合算法(Matlab实现) 代码获取私信回复:熵权法TOPSIS灰色关联度综合算法(Matlab实现) 摘要: 熵权法TOPSIS灰色关联度综合算法(Matlab实现)代码实现了一种…...
React 中如何获取 DOM:用 useRef 操作非受控组件
📌 场景说明 在写 React 的时候,通常我们是通过“受控组件”来管理表单元素,比如用 useState 控制 <input> 的值。 但有些时候,控制的需求只是临时性的,或者完全不需要重新渲染组件,这时候直接访问…...




