【鸿蒙实战开发】数据的下拉刷新与上拉加载

news2024/12/13 3:19:51

本章介绍

本章主要介绍 ArkUI 开发中最常用的场景下拉刷新, 上拉加载,在本章中介绍的内容在实际开发过程当中会高频的使用,所以同学们要牢记本章的内容。下面就让我们开始今天的讲解吧!

List 组件

在 ArkUI 中List容器组件也可以实现数据滚动的效果, 这里为什么先介绍 List 组件,因为在本章节介绍的下拉刷新和上拉加载用到了从此组件,所以一起讲解一下。

语法

List(){
  ListItem(){
    
  }
}

注意: 在 List 组件中必须包含 ListItem 子组件才能正常渲染数据,可以理解为每一个 ListItem 对应的就是一条数据。

示例

在这里插入图片描述

@Entry
@Component
struct ListDemoPage {
  build() {
    Column() {
      List() {
        ListItem() {
          Row() {
            Text('测试数据 List')
          }
          .padding(10)
          .width('100%')
        }
        ListItem() {
          Row() {
            Text('测试数据 List')
          }
          .padding(10)
          .width('100%')
        }
        ListItem() {
          Row() {
            Text('测试数据 List')
          }
          .padding(10)
          .width('100%')
        }
        ListItem() {
          Row() {
            Text('测试数据 List')
          }
          .padding(10)
          .width('100%')
        }
        ListItem() {
          Row() {
            Text('测试数据 List')
          }
          .padding(10)
          .width('100%')
        }
      }
      .height(100)
      .divider({strokeWidth:1,color:"#ededed"})
    }
    .height('100%')
    .width('100%')
  }
}

我们发现当页面元素超出了List组件设置的高度,屏幕上就会出现滚动条,并且下拉画面数据到顶部的时候,画面整体也会被下拉。并且上述代码有重复代码,这时我们就可以使用上一章节讲解的循环渲染ForEach组件去渲染列表让我们改造一下代码。
在这里插入图片描述

@Entry
@Component
struct ListDemoPage {

  // 定义一个类型为number,长度为 30 的数组,并且放入数据,数据为当前时间戳
  @State
  data:number[] = new Array(30).fill(Date.now())

  build() {
    Column() {
      // 使用 List 组件
      List() {
        // 循环渲染
        ForEach(this.data,(item:number)=>{
          // 必须使用 ListItem 组件进行包裹
          ListItem() {
            Row() {
              Text(item+"")
            }
            .padding(10)
            .width('100%')
          }
        })

      }
      .height('100%')
      .divider({strokeWidth:1,color:"#ededed"})
    }
    .height('100%')
    .width('100%')
  }
}

下面我们实现下拉刷新添加数据

Refresh 组件

Refresh可以进行页面下拉操作并显示刷新动效的容器组件。Refresh子组件会跟随手势下拉而下移。我们使用这个组件将我们上面的代码进行包裹。

语法
Refresh(){
  
}

介绍一下 可以往Refresh组件传递的参数(先介绍两个)

●refreshing:当前组件是否正在刷新。支持双向绑定
●builder:下拉时,自定义刷新样式的组件。可以自定义下拉刷新样式。

下拉刷新

下面让我们使用Refresh组件实现下拉刷新的功能。
示例
在这里插入图片描述

@Entry
@Component
struct ListDemoPage {

  // 定义数据
  @State
  data:number[] = new Array(30).fill(Date.now())
  // 定义刷新状态 flag
  @State
  private refreshingFlag: boolean = false;
  // 自定义下刷新页面
  @Builder
  private LoadingCustom() {
    Stack() {
      Row() {
        // Loading 组件
        LoadingProgress().width(30).color("#4095cb")
      }
    }.width('100%')
  }

  build() {
    Column() {
      // 使用刷新组件
      Refresh({ refreshing: $$this.refreshingFlag, builder: this.LoadingCustom() }) {
        List() {
          ForEach(this.data, (item: number) => {
            ListItem() {
              Row() {
                Text(item + "")
              }
              .padding(10)
              .width('100%')
            }
          })

        }
        .height('100%')
        .divider({ strokeWidth: 1, color: "#ededed" })
      }
      // 进入刷新状态时触发回调。这里两后停止刷新状态
      .onRefreshing(() => {
        setTimeout(() => {
          this.refreshingFlag = false
        }, 2000)
      })
      // 设置触发刷新的下拉偏移量。
      .refreshOffset(64)
      // 设置当下拉距离超过refreshOffset时是否触发刷新。
      .pullToRefresh(true)
    }
    .height('100%')
    .width('100%')
  }
}

上述代码中使用@builder 装饰器修饰的内容可以理解为一个子画面,实现了自定义刷新页面,本章先不过多的说@builder 的作用。
现在只需在onRefreshing的方法中新增 List 的数据即可。

 .onRefreshing(() => {
        setTimeout(() => {
          this.refreshingFlag = false
          // 添加数据
          this.data.push(...Array(30).fill(Date.now()))
        }, 2000)
 })

效果:
在这里插入图片描述

如上图所示,每次下拉刷新后画面会新增 30 条数据。

上拉加载

Refresh组件中没有提供上拉加载的功能,我们可以结合 List 组件的事件来实现此功能。
示例
在这里插入图片描述

我们发现当页面的滚动条触底时,会触发加载数据的事件,此时我们需要在代码中知道当前滚动条的状态。

import { promptAction } from '@kit.ArkUI';

@Entry
@Component
struct ListDemoPage {

  @State
  data:number[] = new Array(30).fill(Date.now())

  @State
  private refreshingFlag: boolean = false;
  // 判断滚动条是否触底
  @State
  private isEnd: boolean = false;
  // 使用Scroller对象
  scroller: Scroller = new Scroller();

  @Builder
  private LoadingCustom() {
    Stack() {
      Row() {
        LoadingProgress().width(30).color("#4095cb")
      }

    }.width('100%')
  }

  build() {
    Column() {
      Refresh({ refreshing: $$this.refreshingFlag, builder: this.LoadingCustom() }) {
        List() {
          ForEach(this.data, (item: number) => {
            ListItem() {
              Row() {
                Text(item + "")
              }
              .padding(10)
              .width('100%')
            }
          })

        }
        .height('100%')
        .divider({ strokeWidth: 1, color: "#ededed" })
        // 当画面能滚动说明没有触底
        .onScrollStart(() => {
          this.isEnd = false
        })
        // 判断当前是否停止滚动
        .onScrollStop(() => {
          // 如果停止滚动并且满足滚动条已经在底部进行数据的加载。
          if (this.isEnd) {
            // 加载数据
            promptAction.showToast({ message: '加载数据' })
            setTimeout(()=>{
              this.data.push(...Array(30).fill(Date.now()))
              // 加载完数据把滚动条移至底部
              this.scroller.scrollEdge(Edge.Bottom)
            },1000)
          }
        })
        // 当滚动条触底把 flag 设置成 true
        .onReachEnd(() => {
          this.isEnd = true
        })
      }
      .onRefreshing(() => {
        setTimeout(() => {
          this.refreshingFlag = false
          this.data.push(...Array(30).fill(Date.now()))
        }, 2000)
      })
      .refreshOffset(64)
      .pullToRefresh(true)
    }
    .height('100%')
    .width('100%')
  }
}

写在最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。

这份鸿蒙(HarmonyOS NEXT)文档包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习文档能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习文档

鸿蒙(HarmonyOS NEXT)5.0最新学习路线

在这里插入图片描述

有了路线图,怎么能没有学习文档呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习文档

《鸿蒙 (OpenHarmony)开发入门教学视频》

在这里插入图片描述

《鸿蒙生态应用开发V3.0白皮书》

在这里插入图片描述

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

在这里插入图片描述

《鸿蒙开发基础》

●ArkTS语言
●安装DevEco Studio
●运用你的第一个ArkTS应用
●ArkUI声明式UI开发
.……
在这里插入图片描述

《鸿蒙开发进阶》

●Stage模型入门
●网络管理
●数据管理
●电话服务
●分布式应用开发
●通知与窗口管理
●多媒体技术
●安全技能
●任务管理
●WebGL
●国际化开发
●应用测试
●DFX面向未来设计
●鸿蒙系统移植和裁剪定制
……
在这里插入图片描述

《鸿蒙进阶实战》

●ArkTS实践
●UIAbility应用
●网络案例
……
在这里插入图片描述

获取以上完整鸿蒙HarmonyOS学习文档,请点击→纯血版全套鸿蒙HarmonyOS学习文档

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

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

相关文章

UnityShaderLab 实现程序化形状(一)

1.实现一个长宽可变的矩形: 代码: fixed4 frag (v2f i) : SV_Target{return saturate(length(saturate(abs(i.uv - 0.5)-0.13)))/0.03;} 2.实现一个半径可变的圆形: 代码: fixed4 frag (v2f i) : SV_Target{return (distance(a…

高阶数据结构--B树B+树实现原理B树模拟实现--Java

目录 一、B-树概念 二、B-树插入分析 1.用序列{53, 139, 75, 49, 145, 36, 101}构建B树的过程如下: 2.插入过程总结 三、B树插入实现 四、B树 1.B树概念 2.B树的特性 五、B树应用 1.索引 2.Mysql索引 3.InnoDB 一、B-树概念 1970 年, R.Bayer 和…

网络安全——防火墙

基本概念 防火墙是一个系统,通过过滤传输数据达到防止未经授权的网络传输侵入私有网络,阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障,因为网上总有黑客和恶意攻击入侵私有网络来破坏,防火…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…

Ant Design Pro实战--day01

下载nvm https://nvm.uihtm.com/nvm-1.1.12-setup.zip 下载node.js 16.16.0 //非此版本会报错 nvm install 16.16.0 安装Ant Design pro //安装脚手架 npm i ant-design/pro-cli -g //下载项目 pro create myapp //选择版本 simple 安装依赖 npm install 启动umi yarn add u…

一、为什么要学习麒麟?

麒麟认证:开启职业晋升之门 当前,就业难已经成为一个普遍的社会问题。许多大学生毕业后面临着找工作的困境,他们往往发现自己很难找到满意的职位。即使有幸找到了工作,也经常需要应对工作压力大、薪资低等问题。除此之外&#xff…

python如何减小维度

ravel():将多维数组拉平(一维)。 flatten():将多维数组拉平,并拷贝一份。 squeeze():除去多维数组中,维数为1的维度&…

未来已来:人工智能如何重塑我们的生活与工作

引言 未来的生活和工作场景正从想象走向现实。想象一下,一个清晨,语音助手已经为你安排好一天的任务,自动驾驶汽车准时送你上班,智能冰箱提醒你需要补充的食材。曾经只存在于科幻小说中的场景,如今正在我们的身边实现。…

Adminer源码编译 精简语言中英文和基本使用方法

Adminer是一个小而强悍的基于web的数据库管理工具, 官方默认支持几十种语言,但是对于中国的用户而言只需要有中文和英文就够了,其他语言基本无用。这就需要我们下载Adminer源码自己编译 Adminer.php , 如下图所示 adminer 中英文语言精简版本…

字符编码讲解(C#)

在学习和编码的过程中,极容易遇到如下概念,他们有些是字符编码,有些是涉及的相关概念,接下来我将围绕下面的熟悉又陌生的概念做详细解释,并且梳理其之间的关系 UTF8, Unicode ,ASCII&#xff0…

Mac备忘录表格中换行(`Option` + `Return`(回车键))

在Mac的ARM架构设备上,如果你使用的是Apple的原生“备忘录”应用来创建表格,换行操作可以通过以下步骤来实现: 在单元格中换行: 双击你想要编辑的单元格你可以输入文本,按Option(⌥) Enter来插…

Windows中将springboot项目运行到docker的容器中

0,先打包好项目,再启动docker 1,在Java项目根目录下创建一个名为Dockerfile的文件(没有扩展名),并添加以下内容。 # 使用OpenJDK的基础镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR /app# 将项…

HBU深度学习实验14.5-循环神经网络(1.5)

梯度爆炸实验 造成简单循环网络较难建模长程依赖问题的原因有两个:梯度爆炸和梯度消失。一般来讲,循环网络的梯度爆炸问题比较容易解决,一般通过权重衰减或梯度截断可以较好地来避免;对于梯度消失问题,更加有效的方式…

ZED相机应用

下载SDK wget https://stereolabs.sfo2.cdn.digitaloceanspaces.com/zedsdk/3.6/ZED_SDK_Ubuntu18_cuda11.5_v3.6.5.run 安装 ./ZED_SDK_Ubuntu18_cuda11.5_v3.6.5.run skip_python 测试 cd /usr/local/zed/tools ls ZED_Calibration ZED_Depth_Viewer ZED_Diagnostic ZED_E…

伟测科技再融资11.75亿:增收不增利,毛利率近年来持续下滑

《港湾商业观察》施子夫 王璐 12月9日,上海证券交易所上市审核委员会召开2024年第34次上市审核委员会审议会议,审议上海伟测半导体科技股份有限公司(再融资)(以下简称,伟测科技;688372.SH)事项。 今年8月…

Java爬虫设计:淘宝商品详情接口数据获取

1. 概述 淘宝商品详情接口(如Taobao.item_get)允许开发者通过编程方式,以JSON格式实时获取淘宝商品的详细信息,包括商品标题、价格、销量等。本文档将介绍如何设计一个Java爬虫来获取这些数据。 2. 准备工作 在开始之前&#x…

如何绕过IP禁令

网站、游戏和应用程序可以屏蔽特定IP地址,从而阻止使用该IP地址的任何人访问其服务。这称为IP禁令。管理员可以出于多种原因(例如发出过多请求或可疑活动)屏蔽IP地址。但是,这些禁令会使收集数据或访问在线内容变得更加困难。 一…

AI生成不了复杂前端页面?也许有解决方案了

在2024年,编程成为了人工智能领域最热门的赛道。AI编程技术正以惊人的速度进步,但在生成前端页面方面,AI的能力还是饱受质疑。自从ScriptEcho平台上线以来,我们收到了不少用户的反馈,他们表示:“生成的页面…

支持自定义离线地图地理区域,查询组件及数据源功能增强,DataEase开源BI工具v2.10.3 LTS发布

2024年12月9日,人人可用的开源BI工具DataEase正式发布v2.10.3 LTS版本。 这一版本的功能变动包括:数据源方面,API数据源和Excel数据源支持对字段类型和长度进行设置;图表方面,离线类地图支持自定义地理区域设置&#…

Ubuntu使用telnet连接时出现的错误:没有到主机的路由(能ping通但是还是报错)

Ubuntu使用telnet连接时出现的错误:没有到主机的路由(能ping通但是还是报错) 文章目录 Ubuntu使用telnet连接时出现的错误:没有到主机的路由(能ping通但是还是报错)0.环境1.检查是不是能ping通2.防火墙的问…