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.pswp.cn/web/76321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76321.shtml
英文地址,請注明出處:http://en.pswp.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. 輕拿輕…