HarmonyOS:使用Refresh组件实现页面下拉刷新上拉加载更多

一、前言

可以进行页面下拉操作并显示刷新动效的容器组件。

说明

  • 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
  • 该组件从API Version 12开始支持与垂直滚动的Swiper和Web的联动。当Swiper设置loop属性为true时,Refresh无法和Swiper产生联动。

二、子组件

支持单个子组件。

从API version 11开始,Refresh子组件会跟随手势下拉而下移。

三、接口

Refresh(value: RefreshOptions)

创建Refresh容器。

参数:

参数名类型必填说明
valueRefreshOptions刷新组件参数。

四、属性

支持通用属性外,还支持以下属性:
refreshOffset12+
refreshOffset(value: number)

设置触发刷新的下拉偏移量,当下拉距离小于该属性设置值时离手不会触发刷新。

参数:

参数名类型必填说明
valuenumber下拉偏移量,单位vp。
默认值:未设置promptText参数时为64vp,设置了promptText参数时为96vp。
如果取值为0或负数的时候此接口采用默认值。

pullToRefresh12+
pullToRefresh(value: boolean)

设置当下拉距离超过refreshOffset时是否能触发刷新。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名类型必填说明
valueboolean当下拉距离超过refreshOffset时是否能触发刷新。true表示能触发刷新,false表示不能触发刷新。
默认值:true

五、事件

除支持通用事件外,还支持以下事件:

onStateChange
onStateChange(callback: (state: RefreshStatus) => void)

当前刷新状态变更时,触发回调。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数

参数名类型必填说明
stateRefreshStatus刷新状态。

onRefreshing
onRefreshing(callback: () => void)

进入刷新状态时触发回调。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

onOffsetChange12+
onOffsetChange(callback: Callback)

下拉距离发生变化时触发回调。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数

参数名类型必填说明
callbackCallback下拉距离。
单位:vp

RefreshStatus枚举说明
Refresh刷新状态枚举。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称说明
Inactive0默认未下拉状态。
Drag1下拉中
OverDrag2下拉中,下拉距离超过刷新距离。
Refresh3下拉结束,回弹至刷新距离,进入刷新中状态。
Done4刷新结束,返回初始状态(顶部)。

六、示例

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)})}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

55、⾸屏加载⽩屏怎么进⾏优化

答&#xff1a; &#xff08;1&#xff09;使⽤CDN 减⼩代码体积&#xff0c;加快请求速度&#xff1b; (2)SSR通过服务端把所有数据全部渲染完成再返回给客⼾端&#xff1b; (3) 路由懒加载&#xff0c;当⽤⼾访问的时候&#xff0c;再加载相应模块&#xff1b; (4) 使⽤外…

什么是Python单例模式

什么是Python单例模式 Python单例模式是一种创建型设计模式,目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。以下从作用和示例进行介绍: 作用 控制资源使用:避免对系统资源的重复消耗,像数据库连接、文件句柄等稀缺资源,只创建一个实例来管理使用,防…

Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇

各位Java开发者们好&#xff01;&#x1f680; 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主&#xff0c;今天我将带大家深入探索Java生态即将迎来的5大技术趋势&#xff0c;特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗&#xff…

计算机视觉cv2入门之车牌号码识别

前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识&#xff0c;这里我们以车牌号码识别这一案例来实操一下。 大致思路 车牌号码识别的大致流程可以分为这三步&#xff1a;图像预处理-寻找车牌轮廓-车牌OCR识别 接下来我们按照这三步来进行讲解。 图像预处理 …

CExercise_13_1排序算法_3快速排序算法,包括单向分区以及双向分区

题目&#xff1a; 请手动实现快速排序算法&#xff0c;包括单向分区以及双向分区&#xff1a; // 单向分区快速排序算法 void quick_sort_one_way(int arr[], int len); //双向分区快速排序算法 void quick_sort_two_way(int arr[], int len); 关键点 分析&#xff1a; &#x…

FPGA-VGA

目录 前言 一、VGA是什么&#xff1f; 二、物理接口 三、VGA显示原理 四、VGA时序标准 五、VGA显示参数 六、模块设计 七、波形图设计 八、彩条波形数据 前言 VGA的FPGA驱动 一、VGA是什么&#xff1f; VGA&#xff08;Video Graphics Array&#xff09;是IBM于1987年推出的…

Linux和Ubuntu的驱动适配情况

旧 一、Linux Yocto3.0 二、Ubuntu 1.驱动 1.rtc正常 2.led正常 3.加密芯片正常 4.硬件看门狗不行&#xff0c;驱动已经适配好&#xff0c;等硬件修复后&#xff0c;直接使用脚本就可以 5.千兆网口可以&#xff0c;两个百兆网口不行 6.USB上面和下面都可以&#xff08;插u盘…

Python 文本和字节序列(处理文本文件)

本章将讨论下述话题&#xff1a; 字符、码位和字节表述 bytes、bytearray 和 memoryview 等二进制序列的独特特性 全部 Unicode 和陈旧字符集的编解码器 避免和处理编码错误 处理文本文件的最佳实践 默认编码的陷阱和标准 I/O 的问题 规范化 Unicode 文本&#xff0c;进行安全的…

【Android学习记录】工具使用

文章目录 一. 精准找视图资源ID1. 准备工作2. 使用 uiautomator 工具2.1. 获取设备的窗口内容2.2. Pull XML 文件2.3. 查看 XML 文件 3. 直接使用 ADB 命令4. 使用 Android Studio 的 Layout Inspector总结 二. adb shell dumpsys activity1. 如何使用 ADB 命令2. 输出内容解析…

Kafka系列之:计算kafka集群topic占的存储大小

Kafka系列之:计算kafka集群topic占的存储大小 topic存储数据格式统计topic存储大小定时统计topic存储大小topic存储数据格式 单位是字节大小 size_bytes{directory="/data/datum/kafka/optics-all" } 782336计算topic存储大小脚本逻辑是: 计算指定目录或文件的大小…

C# 高级编程:Lambda 表达式

在 C# 的高级编程中,Lambda 表达式是一个强大而灵活的工具,广泛应用于 LINQ 查询、委托、事件处理以及函数式编程等多个领域。它不仅使代码更简洁、表达更直接,而且在某些场景中能极大提高代码的可读性与可维护性。本文将从 Lambda 表达式的基本语法入手,深入探讨其原理、常…

《软件设计师》复习笔记(11.5)——测试原则、阶段、测试用例设计、调试

目录 1. 测试基础概念 2. 测试方法分类 3. 测试阶段 真题示例&#xff1a; 题目1 题目2 题目3 4. 测试策略 5. 测试用例设计 真题示例&#xff1a; 6. 调试与度量 真题示例&#xff1a; 1. 测试基础概念 定义&#xff1a;系统测试是为发现错误而执行程序的过程&…

方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】

在电力市场背景下,传统电力现货市场存在电能定价不合理、分布式电源并网困难等问题。本虚拟电厂标杆项目旨在研究全时间尺度虚拟电厂智能管控关键技术,通过研制虚拟电厂控制器样机、开发运行管理平台,实现对分布式能源的合理优化配置。项目内容涵盖虚拟调控、建设目标、建设…

PyTorch 深度学习实战(37):分布式训练(DP/DDP/Deepspeed)实战

在上一篇文章中&#xff0c;我们探讨了混合精度训练与梯度缩放技术。本文将深入介绍分布式训练的三种主流方法&#xff1a;Data Parallel (DP)、Distributed Data Parallel (DDP) 和 DeepSpeed&#xff0c;帮助您掌握大规模模型训练的关键技术。我们将使用PyTorch在CIFAR-10分类…

OpenAI重返巅峰:o3与o4-mini引领AI推理新时代

引言 2025年4月16日&#xff0c;OpenAI发布了全新的o系列推理模型&#xff1a;o3和o4-mini&#xff0c;这两款模型被官方称为“迎今为止最智能、最强大的大语言模型&#xff08;LLM&#xff09;”。它们不仅在AI推理能力上实现了质的飞跃&#xff0c;更首次具备了全面的工具使…

【AI插件开发】Notepad++ AI插件开发实践:支持配置界面

一、引用 此前的系列文章已基本完成了Notepad的AI插件的功能开发&#xff0c;但是此前使用的配置为JSON配置文件&#xff0c;不支持界面配置。 本章在此基础上集成支持配置界面&#xff0c;这样不需要手工修改配置文件&#xff0c;直接在界面上操作&#xff0c;方便快捷。 注…

Android12 ServiceManager::addService源码解读

源码 Status ServiceManager::addService(const std::string& name, const sp<IBinder>& binder, bool allowIsolated, int32_t dumpPriority) {auto ctx mAccess->getCallingContext();// apps cannot add servicesif (multiuser_get_app_id(ctx.uid) >…

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案&#xff08;轻量级首选&#xff09; // 创建全局 Context 对象 const GlobalContext createConte…

第四十八篇 电信行业数仓建设实战指南:从架构设计到场景落地

目录 一、云原生架构设计实战1.1 计算存储分离架构搭建1.2 实时离线融合方案 二、维度建模深度解析2.1 电信业务建模方法论2.2 典型模型设计示例 三、ETL流程优化实践3.1 增量同步技术选型3.2 数据清洗规范 四、核心场景实现方案4.1 用户流失预警模型 五、数据治理实施指南5.1 …

2025年山东燃气瓶装送气工考试真题练习

燃气瓶装送气工考试真题练习 单选题 1、液化石油气主要成分是&#xff08; &#xff09;。 A. 甲烷 B. 丙烷、丁烷 C. 一氧化碳和氢气 答案&#xff1a;B 2、燃气钢瓶搬运过程中&#xff0c;正确的做法是&#xff08; &#xff09;。 A. 滚动钢瓶 B. 踢钢瓶 C. 轻拿轻…