当前位置: 首页 > news >正文

HarmonyOS开发之(下拉刷新,上拉加载)控件pulltorefresh组件的使用

效果图:

一:下载安装(地址:OpenHarmony-SIG/PullToRefresh)

ohpm install @ohos/pulltorefresh

二:使用lazyForEarch的数据作为数据源

export  class  BasicDataSource implements IDataSource{private listeners: DataChangeListener[] = []public totalCount(): number {return 0}public getData(index: number): Object {return index}// 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听registerDataChangeListener(listener: DataChangeListener): void {if (this.listeners.indexOf(listener) < 0) {console.info('add listener')this.listeners.push(listener)}}// 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听unregisterDataChangeListener(listener: DataChangeListener): void {const pos = this.listeners.indexOf(listener);if (pos >= 0) {console.info('remove listener')this.listeners.splice(pos, 1)}}// 通知LazyForEach组件需要重载所有子组件notifyDataReload(): void {this.listeners.forEach(listener => {listener.onDataReloaded()})}// 通知LazyForEach组件需要在index对应索引处添加子组件notifyDataAdd(index: number): void {this.listeners.forEach(listener => {listener.onDataAdd(index)})}// 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件notifyDataChange(index: number): void {this.listeners.forEach(listener => {listener.onDataChange(index)})}// 通知LazyForEach组件需要在index对应索引处删除该子组件notifyDataDelete(index: number): void {this.listeners.forEach(listener => {listener.onDataDelete(index)})}// 数据移动起始位置与数据移动目标位置交换完成后调用notifyDataMove(from: number, to: number): void {this.listeners.forEach(listener => {listener.onDataMove(from, to)})}
}
export  class MyDataNewSource extends BasicDataSource{private dataArray:  string[]=[]public totalCount(): number {return this.dataArray.length}public getData(index: number): Object {return this.dataArray[index]}public addData(index: number, data: string): void {this.dataArray.splice(index, 0, data)this.notifyDataAdd(index)}public pushData(data: string): void {this.dataArray.push(data)this.notifyDataAdd(this.dataArray.length - 1)// 重新加载}public clear():void{this.dataArray=[]}
}

三:快速使用

import router from '@ohos.router';
import { dateList } from '../model/wallpaperBeanList';
import weatherApi from '../DbUtils/WeatherApi';
import { MyDataNewSource} from '../DbUtils/MyDataSource';
import { PullToRefresh, PullToRefreshConfigurator } from '@ohos/pulltorefresh'@Component
export struct WallpaperPage {@State typeID: number = 0@State wallpaperUrlList: dateList [] = []dataSource: MyDataNewSource = new MyDataNewSource()// 需绑定列表或宫格组件private scroller: Scroller = new Scroller()timer: null | number = nullprivate currentPage: number = 1;//当前页码private pageSize: number = 12; // 默认加载数量private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator();aboutToAppear() {this.refreshConfigurator.setHasRefresh(true)// 是否具有下拉刷新功能.setHasLoadMore(true)// 是否具有上拉加载功能.setMaxTranslate(150)// 可下拉上拉的最大距离.setSensitivity(1)// 下拉上拉灵敏度.setListIsPlacement(false)// 滑动结束后列表是否归位.setAnimDuration(300)// 滑动结束后,回弹动画执行时间.setRefreshHeight(50)// 下拉动画高度.setRefreshColor('#638EEF')// 下拉动画颜色.setRefreshBackgroundColor($r('app.color.home_bg'))// 下拉动画区域背景色.setRefreshTextColor('#638EEF')// 下拉加载完毕后提示文本的字体颜色.setRefreshTextSize(15)// 下拉加载完毕后提示文本的字体大小.setRefreshAnimDuration(1000)// 下拉动画执行一次的时间.setLoadImgHeight(50)// 上拉图片高度.setLoadBackgroundColor($r('app.color.home_bg'))// 上拉动画区域背景色.setLoadTextColor('#638EEF')// 上拉文本的字体颜色.setLoadTextSize(15)// 上拉文本的字体大小.setLoadTextPullUp1('请继续上拉...')// 上拉1阶段文本.setLoadTextPullUp2('释放即可刷新')// 上拉2阶段文本.setLoadTextLoading('加载中...') // 上拉加载更多中时的文本// .setRefreshCompleteTextHoldTime(500) //上拉刷新后停留的时间, 默认一秒, 建议设置500this.fetchWallpapers(this.currentPage)}//根据当前页面查找数据源(typeID=>类型id)private fetchWallpapers(pageNum: number = 1) {weatherApi.wallpaperList(this.typeID, pageNum, this.pageSize).then(wallpaperListBean => {this.wallpaperUrlList = wallpaperListBean.data.list // Assuming your API structurethis.dataSource.clear() // Clear the old datafor (let index = 0; index < this.wallpaperUrlList.length; index++) {this.dataSource.pushData(this.wallpaperUrlList[index].imgUrl)}}).catch(error => {console.error("Error fetching wallpapers:", error)})}build() {Column() {PullToRefresh({// 必传项,需绑定传入主体布局内的列表或宫格组件scroller: this.scroller,// 必传项,自定义主体布局,内部有列表或宫格组件customList: () => {// 一个用@Builder修饰过的UI方法this.getListView()},refreshConfigurator:this.refreshConfigurator,mWidth:'100%',mHeight:'100%',// 可选项,下拉刷新回调onRefresh: () => {return new Promise<string>((resolve, reject) => {// 网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据this.fetchWallpapers(1) // Fetch first page datathis.currentPage = 1 // Reset the page countthis.timer = setTimeout(() => {resolve('刷新成功')console.log(' 刷新成功')}, 2000)})},// 可选项,上拉加载更多回调onLoadMore: () => {return new Promise<string>((resolve, reject) => {// 网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据this.currentPage++; // Increment the page numberthis.fetchWallpapers(this.currentPage); // Fetch the next page of datathis.timer = setTimeout(() => {resolve('上拉加载完成')console.log('上拉加载完成')}, 2000)})},customLoad: null,customRefresh: null,})}.width('100%').height('100%')}@Builderprivate getListView() {Grid(this.scroller) {LazyForEach(this.dataSource, (item, index) => {GridItem() {// 显示网络图片Image(item || $r('app.color.color_white_f0f8')).width('100%').height('20%').alt($r('app.color.color_white_f0f8')).borderRadius(8).onAppear(() => { //组件挂载显示触发if (index) {console.log("Loading  onAppear: index=" + item + ' content= ' + this.dataSource.getData(index));}}).onDisAppear(() => { //组件卸载载显示触发if (index) {console.log("Loading  onDisAppear: index=" + index + ' content= ' + this.dataSource.getData(index));}}).onClick(() => this.handleImageClick(item)); // 注册点击事件}}, (item: string) => item)}.columnsTemplate('1fr 1fr 1fr').columnsGap(15).rowsGap(10).cachedCount(10).margin({top:15}).layoutDirection(GridDirection.Row).width('90%').height('100%')}aboutToDisappear() {clearTimeout(this.timer)this.dataSource.clear()}// 处理点击事件handleImageClick(imageUrl: string) {router.pushUrl({url: "pages/WallpaperDetailsPage",params: {imageUrl: imageUrl}})}
}

注意:在api9 开发的时候注意以下两点

1,依赖PullToRefresh 中

@Link data: Object[] 改==》 @State data: Object[]=[];

不然使用的时候PullToRefresh 会报:'@Link' decorated 'data' must be initialized through the component constructor. <ArkTSCheck>

2,同样的在PullToRefresh中找到 this.scroller.isAtEnd(),注释掉,api9 中找不到 this.scroller.isAtEnd()方法

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 宏任务微任务题目
  • 【运维监控】influxdb 2.0+telegraf 监控tomcat 8.5运行情况(2)
  • 数据结构---双向链表(内存泄露相关知识)
  • 机器学习 第8章 集成学习
  • consul配置ACL安全认证
  • 又一款强大好用的Shell脚本项目,支持Bash,Sh、Dash、Ksh等,甚至可以在编辑器中直接用,程序员必备!(附源码)
  • AIGC大模型扩图:Sanster/IOPaint(4)
  • CyclicBarrier CountDownLatch
  • CSS 基础
  • 15.2 定义一个prometheus数据存储使用的pv
  • 若依Ruoyi之智能售货机运营管理系统(新增运营运维工单管理)
  • 第151天:红队APT-钓鱼篇邮件钓鱼SPF绕过自建邮件系统SwaksGophish
  • 如何让Google收录我的网站?
  • Docker 部署 Redis (图文并茂超详细)
  • 如何通俗易懂的解释TON的智能合约
  • Apache Zeppelin在Apache Trafodion上的可视化
  • chrome扩展demo1-小时钟
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Javascripit类型转换比较那点事儿,双等号(==)
  • overflow: hidden IE7无效
  • Promise面试题,控制异步流程
  • React Native移动开发实战-3-实现页面间的数据传递
  • spark本地环境的搭建到运行第一个spark程序
  • SQLServer插入数据
  • Vue组件定义
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 分布式事物理论与实践
  • 前端js -- this指向总结。
  • 前端之React实战:创建跨平台的项目架构
  • 使用 QuickBI 搭建酷炫可视化分析
  • 用Visual Studio开发以太坊智能合约
  • 说说我为什么看好Spring Cloud Alibaba
  • ​flutter 代码混淆
  • ​Java基础复习笔记 第16章:网络编程
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #162 (Div. 2)
  • #ifdef 的技巧用法
  • $().each和$.each的区别
  • (0)Nginx 功能特性
  • (2)nginx 安装、启停
  • (39)STM32——FLASH闪存
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (六)vue-router+UI组件库
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转载)利用webkit抓取动态网页和链接
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 8 发布了,试下微软最近强推的MAUI