【Harmony OS】【ARK UI】ETS 的 List 實現下拉刷新功能實現

来源:https://www.cnblogs.com/developer-huawei/archive/2022/04/14/16134350.html
-Advertisement-
Play Games

在HarmonyOS開發中List下拉刷新是一種很常見的問題,今天描述怎麼實現List下拉刷新的功能實現,主要分為“開發準備”,“代碼實現”,“運行效果” 1. 開發準備 我們需要學習以下知識點 1.1 【Harmony OS】【ARK UI】【Demo】載入動畫實現 1.2 PanGesture ...


在HarmonyOS開發中List下拉刷新是一種很常見的問題,今天描述怎麼實現List下拉刷新的功能實現,主要分為“開發準備”,“代碼實現”,“運行效果”

1. 開發準備 我們需要學習以下知識點

1.1 【Harmony OS】【ARK UI】【Demo】載入動畫實現

1.2 PanGesture

1.3 List ListItem

1.4 顯隱控制

 

2. 代碼實現

2.1 準備數據源

定義全量數據源:用於載入每次載入部分數據

定義List顯示數據源:用於List顯示在界面上 代碼如下

private arr: string[] = ["A", "B", "C", "D", "E", "F", "G", "H"] //todo 當前list顯示數據源
private AllData: string[] = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] //todo 全量數據

2.2 使用 List 和ListItem【Harmony OS】【ARK UI】【Demo】載入動畫實現來 繪畫基本界面,代碼如

Column() {
      List({ space: 20, initialIndex: 0 }) {
        ListItem() {
          Column() {
            Image($r("app.media.loading"))
              .objectFit(ImageFit.Contain)
              .height(40)
              .aspectRatio(1)
              .width(40)
              .margin({ bottom: 5 })
              .rotate({ x: 0, y: 0, z: 1, angle: this.rotateAngle })
            Text(this.loadingText)
              .fontSize(14)
              .fontColor("#ed6262")
              .backgroundColor(Color.White)
          }
          .alignItems(HorizontalAlign.Center)
          .padding({ top: 10, right: 0, bottom: 10, left: 0 })
          .width("100%")
          .padding({ top: 10, right: 0, bottom: 10, left: 0 })
          .backgroundColor(Color.White)
        }

        ForEach(this.arr, (item) => {
          ListItem() {
            Text('' + item)
              .width('100%')
              .height(100)
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .borderRadius(10)
              .backgroundColor(0xFFFFFF)
          }
        }, item => item)
      }
      .listDirection(Axis.Vertical) // 排列方向
      .onScrollIndex((firstIndex: number, lastIndex: number) => {
        //Todo firstIndex屏幕第一個可見條目索引
        //todo lastIndex屏幕最後可見索引
        this.firstIndex = firstIndex;
      })
 
}.width('100%')

2.3 控制載入動畫顯示或者隱藏

我們可以學習顯隱控制來控制載入動畫顯示隱藏,定義一個全局變數來進行控制動畫顯示隱藏,代碼如下

  @State IsShowLoading: boolean= true//動畫顯示隱藏 預設是顯示狀態
  .visibility((this.IsShowLoading ? Visibility.Visible : Visibility.None))//Todo 動畫顯示隱藏

cke_12311.png

2.4 控制項List下拉刷新動畫

刷新臨界值:只用當List第一條屏幕可見索引為0的時候,並且上下拉鬆開的時候開始載入數據

List第一條屏幕可見索引獲取,我們參List的onScrollIndex的Api,並且定義一個變數進行獲取到值 代碼如下

.onScrollIndex((firstIndex: number, lastIndex: number) => {
//Todo firstIndex屏幕第一個可見條目索引
//todo lastIndex屏幕最後可見索引
this.firstIndex = firstIndex;
})

2.5 手勢判斷,我們參考PanGesture文檔,代碼如下

  .parallelGesture(
      PanGesture({ distance: 150, direction: PanDirection.Down })
        .onActionStart(this.ActionStart.bind(this))
        .onActionUpdate(this.ActionUpdate.bind(this))
        .onActionEnd(this.ActionEnd.bind(this))
        .onActionCancel(this.ActionCancel.bind(this))
      )

   public ActionStart(event) {
    clearInterval(this.rotateTimeOut)
    if (this.firstIndex === 0 && this.arr.length > 0) { //判斷是否刷新
      this.IsShowLoading = true;
      this.loadingText = "開始刷新"
    }
  }

  private ActionUpdate() {
    clearInterval(this.rotateTimeOut)//Todo 取消之前動畫
    this.loadingText = "正在刷新"
    console.log(this.loadingText)

  }

  private ActionEnd() {
    this.loadingText = "開始刷新數據"
    console.log(this.loadingText)
    //開始刷新數據



    this.loadingRotate();
    this.loadingData(); //載入數據
  }

  private ActionCancel() {
    //取消動畫
    this.IsShowLoading = false;
    this.loadingText = "刷新取消"
    console.log(this.loadingText)
    clearInterval(this.rotateTimeOut)
  }

2.6刷新數據代碼如下

//網路載入數據

  private loadingData() {
    console.log("loadingData=====")
    var that = this;
    //延遲幾秒執行這個代碼 取消動畫
    setTimeout(function () {
      console.log("loadingData=====開始")
      var random=Math.ceil(Math.random()*10);;
      that.arr.splice(0,8)
      for(var i=random;i<random+8;i++){
        that.arr.push(that.AllData[i])
      }
      console.log("loadingData=====clearInterval")
      clearInterval(this.rotateTimeOut)
      console.log("loadingData===取消動畫")
      that.IsShowLoading = false
    }, 5000)
  }

3.運行效果

3.1全部代碼如下

@Entry
@Component
struct MyListView {
  private arr: string[] = ["A", "B", "C", "D", "E", "F", "G", "H"] //todo 當前數據源
  private AllData: string[] = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
  private firstIndex: number= 0;
//-1 代表正常狀態 0代表下拉刷新 1 代表上拉載入
  @State loadingText: string = '正在刷新' //文本
  @State IsShowLoading: boolean= true//動畫顯示隱藏 預設是顯示狀態
  private rotateTimeOut: any //計時器
  @State rotateAngle: number= 0;
//載入圖標旋轉
  loadingRotate() {
    this.rotateTimeOut = setInterval(() => {
      this.rotateAngle = 0
      animateTo({ duration: 800 }, () => {
        this.rotateAngle = 360
      })
    }, 800)
  }

  public ActionStart(event) {
    clearInterval(this.rotateTimeOut)
    if (this.firstIndex === 0 && this.arr.length > 0) { //判斷是否刷新
      this.IsShowLoading = true;
      this.loadingText = "開始刷新"
    }
  }

  private ActionUpdate() {
    clearInterval(this.rotateTimeOut)//Todo 取消之前動畫
    this.loadingText = "正在刷新"
    console.log(this.loadingText)

  }

  private ActionEnd() {
    this.loadingText = "開始刷新數據"
    console.log(this.loadingText)
    //開始刷新數據



    this.loadingRotate();
    this.loadingData(); //載入數據
  }

  private ActionCancel() {
    //取消動畫
    this.IsShowLoading = false;
    this.loadingText = "刷新取消"
    console.log(this.loadingText)
    clearInterval(this.rotateTimeOut)
  }
//網路載入數據
  private loadingData() {
    console.log("loadingData=====")
    var that = this;
    //延遲幾秒執行這個代碼 取消動畫
    setTimeout(function () {
      console.log("loadingData=====開始")
      var random=Math.ceil(Math.random()*10);;
      that.arr.splice(0,8)
      for(var i=random;i<random+8;i++){
        that.arr.push(that.AllData[i])
      }
      console.log("loadingData=====clearInterval")
      clearInterval(this.rotateTimeOut)
      console.log("loadingData===取消動畫")
      that.IsShowLoading = false
    }, 5000)
  }

  build() {
    Column() {
      List({ space: 20, initialIndex: 0 }) {
        ListItem() {
          Column() {
            Image($r("app.media.loading"))
              .objectFit(ImageFit.Contain)
              .height(40)
              .aspectRatio(1)
              .width(40)
              .margin({ bottom: 5 })
              .rotate({ x: 0, y: 0, z: 1, angle: this.rotateAngle })
            Text(this.loadingText)
              .fontSize(14)
              .fontColor("#ed6262")
              .backgroundColor(Color.White)
          }
          .alignItems(HorizontalAlign.Center)
          .padding({ top: 10, right: 0, bottom: 10, left: 0 })
          .width("100%")
          .padding({ top: 10, right: 0, bottom: 10, left: 0 })
          .backgroundColor(Color.White)
        }
        .visibility((this.IsShowLoading ? Visibility.Visible : Visibility.None))//Todo 動畫顯示隱藏

        ForEach(this.arr, (item) => {
          ListItem() {
            Text('' + item)
              .width('100%')
              .height(100)
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .borderRadius(10)
              .backgroundColor(0xFFFFFF)
          }
        }, item => item)
      }
      .listDirection(Axis.Vertical) // 排列方向
      .onScrollIndex((firstIndex: number, lastIndex: number) => {
        //Todo firstIndex屏幕第一個可見條目索引
        //todo lastIndex屏幕最後可見索引
        this.firstIndex = firstIndex;
      })
      .parallelGesture(
      PanGesture({ distance: 150, direction: PanDirection.Down })
        .onActionStart(this.ActionStart.bind(this))
        .onActionUpdate(this.ActionUpdate.bind(this))
        .onActionEnd(this.ActionEnd.bind(this))
        .onActionCancel(this.ActionCancel.bind(this))
      )
    }.width('100%')


  }
}

3.2運行效果圖如下

 

8d0f286071065cc016dd2c47232fc635_663x1074.gif%40900-0-90-f.gif

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 什麼是資料庫 資料庫是“按照數據結構來組織、存儲和管理數據的倉庫”。是一個長期存儲在電腦內的、有組織的、可共用的、統一管理的大量數據的集合。簡單的來說就像是一個大型的衣櫃,你所有春夏秋冬的衣服都被統一放在了一個衣櫃里,然後分類,分季節的有序擺放好。資料庫的優點重點在於體量足夠的大,一般的數據 ...
  • 12月21日,在第十一屆中國資料庫技術大會(DTCC)2020數據風雲獎評選活動中,華為雲資料庫GaussDB(openGauss)和金融行業核心資料庫上雲解決方案分別榮獲“年度最佳創新產品獎”、“年度最佳創新解決方案獎”。 DTCC2020是由IT168 旗下 ITPUB 企業社區平臺主辦的頂級數 ...
  • 近年來,雲計算已成為主流,企業從自身利益出發,或是不願意被單一雲服務商鎖定,或是業務和數據冗餘,或是出於成本優化考慮,會嘗試將部分或者全部業務從線下機房遷移到雲或者從一個雲平臺遷移到另一個雲平臺,業務遷移涉及到數據的遷移。正好 JuiceFS 已經對接了各種對象存儲的 API ,也實現了數據同步的邏 ...
  • 本文介紹瞭如何使用 SQL 的 SELECT 語句來檢索單個表列、多個表列以及所有表列。也介紹瞭如何返回不同的值以及如何註釋代碼。 一、SELECT 語句 正如 學習 SQL 之前需要瞭解的基礎知識 所述,SQL 語句是由簡單的英語單詞構成的。這些單詞稱為關鍵字,每個 SQL 語句都是由一個或多個關 ...
  • 說起雲會議大家第一想起的就是疫情期間,上網課也好,網上辦公也好等等。在疫情到來之前線上會議就已經有了雛形但是並不完善,但是疫情開始之後,線上會議蓬勃發展,各種雲會議應用而生。雲會議得到了空前的發展,那麼當我們需要一場高質量的雲會議時應該怎麼選擇呢? 雲會議帶給我們體驗最重要的三點:夠清晰、夠流暢、夠 ...
  • 本文為 SQL 初學者介紹了 SQL 究竟是什麼,以及它能做什麼事情。因為 SQL 是用來與資料庫打交道的,所以,我們也介紹了一些基本的資料庫術語。 一、資料庫基礎 你正在讀這這一篇文章,這表明你需要以某種方式與資料庫打交道。SQL 正是用來實現這一任務的語言,因此在學習 SQL 之前,你應該對數據 ...
  • 本章目錄 0x00 數據持久化 1.RDB 方式 2.AOF 方式 如何抉擇 RDB OR AOF? 0x01 備份容災 一、備份 1.手動備份redis資料庫 2.遷移Redis指定db-資料庫 3.Redis集群數據備份與遷移 二、恢復 1.系統Redis用戶被刪除後配置數據恢復流程 2.Kub ...
  • 一、Kotlin基礎 1.數據類型聲明 在Kotlin中要定義一個變數需要使用var關鍵字 //定義了一個可以修改的Int類型變數 var number = 39 如果要定義一個常量可以使用val關鍵字,等價於Java的final關鍵字. val name = "miku" //給val定義的常量再 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...