自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HarmonyOS ArkUI之列表下拉刷新、加載更多(TS)

系統(tǒng) OpenHarmony
本項(xiàng)目界面搭建基于ArkUI中TS擴(kuò)展的聲明式開(kāi)發(fā)范式,主要根據(jù)List中的回調(diào)方法onScrollIndex()監(jiān)聽(tīng)當(dāng)前列表首尾索引,根據(jù)觸摸事件onTouch()處理下拉和上拉。

[[437604]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

簡(jiǎn)介

本項(xiàng)目界面搭建基于ArkUI中TS擴(kuò)展的聲明式開(kāi)發(fā)范式,關(guān)于語(yǔ)法和概念直接看官網(wǎng)官方文檔地址:

基于TS擴(kuò)展的聲明式開(kāi)發(fā)范式1、基于TS擴(kuò)展的聲明式開(kāi)發(fā)范式2

本文介紹列表刷新:

  • 下拉刷新
  • 上拉加載更多

效果演示

HarmonyOS ArkUI之列表下拉刷新、加載更多(TS)-鴻蒙HarmonyOS技術(shù)社區(qū)

主要知識(shí)點(diǎn)

列表容器(List)、觸摸事件(onTouch)、位置設(shè)置(offset)、顯示動(dòng)畫(huà)(animateTo)

實(shí)現(xiàn)思路

主要根據(jù)List中的回調(diào)方法onScrollIndex()監(jiān)聽(tīng)當(dāng)前列表首尾索引,根據(jù)觸摸事件onTouch()處理下拉和上拉。

下拉刷新效果

1、容器布局Column垂直結(jié)構(gòu): 下拉刷新、列表。父容器設(shè)置touch事件,如果當(dāng)列表無(wú)數(shù)據(jù)或者數(shù)據(jù)少,可以全局響應(yīng)。

初始偏移量

下拉刷新: 1(負(fù))自身高度。在屏幕頂部之外。

列表:0,默認(rèn)在頂部。

(部分關(guān)鍵代碼)

  1. ...... 
  2. // 下拉刷新的布局高度 
  3. private pullRefreshHeight = 70 
  4. // 列表y坐標(biāo)偏移量 
  5. @State offsetY: number = 0 
  6.  
  7. build() { 
  8.   Column() { 
  9.     // 下拉刷新 
  10.     Flex() { 
  11.         ...... 
  12.     } 
  13.     .width('100%'
  14.     .height(this.pullRefreshHeight) 
  15.     .offset({ x: 0, y: `${vp2px(-this.pullRefreshHeight) + this.offsetY}px` }) // 布局跟著列表偏移量移動(dòng) 
  16.        
  17.     // 列表 
  18.     List(){ 
  19.         ...... 
  20.     } 
  21.     .offset({ x: 0, y: `${this.offsetY}px` }) // touch事件計(jì)算的偏移量單位是px,記得加上單位 
  22.     .onScrollIndex((start, end) => { // 監(jiān)聽(tīng)當(dāng)前列表首位索引 
  23.       console.info(`${start}=start============end=${end}`) 
  24.       this.startIndex = start 
  25.       this.endIndex = end 
  26.     }) 
  27.   } 
  28.   .width('100%'
  29.   .height('100%')   
  30.   .onTouch((event) => this.listTouchEvent(event)) // 父容器設(shè)置touch事件,當(dāng)列表無(wú)數(shù)據(jù)也可以下拉刷新。 
  31. ...... 

2、touch觸摸事件:

  • 手指移動(dòng)下拉改變偏移量;
  • 手指抬起根據(jù)是否可以刷新:顯示刷新?tīng)顟B(tài);
  • 請(qǐng)求數(shù)據(jù)成功后,關(guān)閉刷新?tīng)顟B(tài)。

(部分關(guān)鍵代碼)

  1. ...... 
  2. // 按下的y坐標(biāo) 
  3. private downY = 0 
  4.  
  5. listTouchEvent(event: TouchEvent){ 
  6.   switch (event.type) { 
  7.     case TouchType.Down: // 手指按下 
  8.       // 記錄按下的y坐標(biāo) 
  9.       this.downY = event.touches[0].y 
  10.       break 
  11.     case TouchType.Move: // 手指移動(dòng) 
  12.       // 當(dāng)首部索引位于0 
  13.       if (this.startIndex == 0) {        
  14.         // 下拉刷新布局高度 
  15.         var height = vp2px(this.pullRefreshHeight) 
  16.         // 滑動(dòng)的偏移量 
  17.         this.offsetY = event.touches[0].y - this.downY 
  18.     
  19.         // 偏移量大于下拉刷新布局高度,達(dá)到刷新條件 
  20.         if (this.offsetY >= height) { 
  21.           // 可以刷新了   
  22.           this.isCanRefresh = true 
  23.           // 狀態(tài)1:松開(kāi)刷新 
  24.           this.pullRefreshState(1) 
  25.           // 偏移量的值緩慢增加 
  26.           this.offsetY = height + this.offsetY * 0.15 
  27.         } else { 
  28.           // 狀態(tài)0:下拉刷新 
  29.           this.pullRefreshState(0) 
  30.         } 
  31.       }           
  32.      break 
  33.     case TouchType.Up: // 手指抬起 
  34.     case TouchType.Cancel: // 觸摸意外中斷:來(lái)電界面 
  35.       // 是否可以刷新 
  36.       if (this.isCanRefresh) { 
  37.         console.info('======執(zhí)行下拉刷新========'
  38.         // 偏移量為下拉刷新布局高度 
  39.         this.offsetY = vp2px(this.pullRefreshHeight) 
  40.         // 狀態(tài)2:正在刷新 
  41.         this.pullRefreshState(2) 
  42.    
  43.         // 模擬耗時(shí)操作 
  44.         setTimeout(() => { 
  45.           // 刷新數(shù)據(jù)   
  46.           this.refreshData() 
  47.           // 關(guān)閉刷新   
  48.           this.closeRefresh() 
  49.         }, 2000) 
  50.    
  51.       } else { 
  52.         console.info('======關(guān)閉下拉刷新!未達(dá)到條件========'
  53.         // 關(guān)閉刷新 
  54.         this.closeRefresh() 
  55.       } 
  56.       break 
  57.   } 
  58. ...... 

以上關(guān)鍵代碼就能實(shí)現(xiàn)下拉刷新

下拉不釋放繼續(xù)上拉可以取消下拉刷新,未達(dá)到條件:動(dòng)畫(huà)收回。

HarmonyOS ArkUI之列表下拉刷新、加載更多(TS)-鴻蒙HarmonyOS技術(shù)社區(qū)

到達(dá)條件:如果一直下拉,下拉偏移量緩慢增加(阻力效果),手指抬起偏移量回到下拉刷新布局高度,等待主動(dòng)關(guān)閉刷新。

HarmonyOS ArkUI之列表下拉刷新、加載更多(TS)-鴻蒙HarmonyOS技術(shù)社區(qū)

上拉加載更多

相對(duì)下拉刷新,上拉加載更多實(shí)現(xiàn)方式比較簡(jiǎn)單。

1、布局結(jié)構(gòu):

就是在List末尾加上ListItem(),當(dāng)?shù)搅俗詈笠晃?,偏移量達(dá)到加載更多的條件,動(dòng)態(tài)顯示布局。

(部分關(guān)鍵代碼)

  1. ...... 
  2. // 上拉加載的布局默認(rèn)高度 
  3. private loadMoreDefaultHeight = 70 
  4. // 上拉加載的布局是否顯示 
  5. @State isVisibleLoadMore: boolean = false 
  6.  
  7. build() { 
  8.   Column() { 
  9.     // 下拉刷新 
  10.     ...... 
  11.        
  12.     // 列表 
  13.     List(){ 
  14.       ForEach(this.list, item => { 
  15.         ListItem() { 
  16.           Column() { 
  17.             Text(`我是測(cè)試內(nèi)容${item}`) 
  18.               .padding(15) 
  19.               .fontSize(18) 
  20.           } 
  21.         } 
  22.       }, item => item.toString()) 
  23.          
  24.       // =======================新增代碼start============================== 
  25.       // 加載更多布局 
  26.       ListItem(){ 
  27.         Flex() { 
  28.           ...... 
  29.         } 
  30.         .width('100%'
  31.         .height(this.loadMoreHeight) 
  32.         .visibility(this.isVisibleLoadMore ? Visibility.Visible : Visibility.None) // 是否顯示布局 
  33.       } 
  34.       // =======================新增代碼end============================== 
  35.     } 
  36.     .offset({ x: 0, y: `${this.offsetY}px` }) // touch事件計(jì)算的偏移量單位是px,記得加上單位 
  37.     .onScrollIndex((start, end) => { // 監(jiān)聽(tīng)當(dāng)前列表首位索引 
  38.       console.info(`${start}=start============end=${end}`) 
  39.       this.startIndex = start 
  40.       this.endIndex = end 
  41.     }) 
  42.   } 
  43.   .width('100%'
  44.   .height('100%')   
  45.   .onTouch((event) => this.listTouchEvent(event)) // 父容器設(shè)置touch事件,當(dāng)列表無(wú)數(shù)據(jù)也可以下拉刷新。 
  46. ...... 

2、touch觸摸事件:

手指移動(dòng)上拉改變偏移量進(jìn)行判斷是否顯示布局;

手指抬起偏移量置為0,請(qǐng)求數(shù)據(jù)成功后,關(guān)閉刷新?tīng)顟B(tài)。

(部分關(guān)鍵代碼)

  1. ...... 
  2. // 按下的y坐標(biāo) 
  3. private downY = 0 
  4.  
  5. listTouchEvent(event: TouchEvent){ 
  6.   switch (event.type) { 
  7.     case TouchType.Down: // 手指按下 
  8.       // 記錄按下的y坐標(biāo) 
  9.       this.downY = event.touches[0].y 
  10.       break 
  11.     case TouchType.Move: // 手指移動(dòng) 
  12.        // 因?yàn)榧虞d更多是在列表后面新增一個(gè)item,當(dāng)一屏能夠展示全部列表,endIndex 為 length+1 
  13.        if (this.endIndex == this.list.length - 1 || this.endIndex == this.list.length) { 
  14.          // 滑動(dòng)的偏移量 
  15.          this.offsetY = event.touches[0].y - this.downY 
  16.          // 達(dá)到加載更多條件   
  17.          if (Math.abs(this.offsetY) > vp2px(this.loadMoreHeight)/2) { 
  18.            this.isCanLoadMore = true 
  19.            // 顯示布局   
  20.            this.isVisibleLoadMore = true 
  21.            // 偏移量緩慢增加  
  22.            this.offsetY = - vp2px(this.loadMoreHeight) + this.offsetY * 0.1 
  23.          } 
  24.        } 
  25.       }           
  26.      break 
  27.     case TouchType.Up: // 手指抬起 
  28.     case TouchType.Cancel: // 觸摸意外中斷:來(lái)電界面 
  29.        animateTo({ 
  30.          duration: 200, // 動(dòng)畫(huà)時(shí)長(zhǎng) 
  31.        }, () => { 
  32.          // 偏移量設(shè)置為0 
  33.          this.offsetY = 0 
  34.        }) 
  35.        if (this.isCanLoadMore) { 
  36.          console.info('======執(zhí)行加載更多========'
  37.          // 加載中... 
  38.          this.isLoading = true 
  39.          // 模擬耗時(shí)操作 
  40.          setTimeout(() => { 
  41.            this.closeLoadMore() 
  42.            this.loadMoreData() 
  43.          }, 2000) 
  44.        } else { 
  45.          console.info('======關(guān)閉加載更多!未達(dá)到條件========'
  46.          this.closeLoadMore() 
  47.        } 
  48.       break 
  49.   } 
  50. ...... 

結(jié)尾

每天進(jìn)步一點(diǎn)點(diǎn)、需要付出努力億點(diǎn)點(diǎn)。

完整代碼加了優(yōu)化,代碼量比較多,就不單獨(dú)貼出來(lái)了

https://gitee.com/liangdidi/ListPullRefreshLoadMoreDemo(需要登錄才能看到演示圖)

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2022-09-26 15:16:03

ArkUITS

2021-11-26 15:31:43

鴻蒙HarmonyOS應(yīng)用

2013-07-17 16:33:02

下拉刷新listvie滾動(dòng)到底部加載Android開(kāi)發(fā)學(xué)習(xí)

2022-08-24 16:08:22

ETS鴻蒙

2016-08-05 17:01:09

AndroidRecyclerVie下拉刷新

2015-03-23 18:11:39

UITableViewswift下拉刷新

2022-04-08 14:47:11

ArkUI列表字母索引鴻蒙

2009-06-06 17:10:01

Java列表排序

2022-07-20 15:32:25

時(shí)鐘翻頁(yè)Text組件

2016-12-26 15:39:35

Android下拉刷新頭部廣告位

2021-09-02 10:00:42

鴻蒙HarmonyOS應(yīng)用

2011-09-01 14:55:41

jQuery Mobi列表視圖

2021-04-28 10:01:06

Python基礎(chǔ)項(xiàng)目

2022-08-23 16:07:02

ArkUI鴻蒙

2022-09-02 15:17:04

ArkUI鴻蒙

2015-04-22 10:57:22

androidSwipeRefres

2022-08-08 19:46:26

ArkUI鴻蒙

2022-11-21 16:15:41

ArkUI鴻蒙

2010-10-09 10:47:03

Javascriptselect

2009-08-07 16:09:25

ASP.NET AJA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)