HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载,Scroll滚动到顶部

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载

效果展示

在这里插入图片描述
在这里插入图片描述

使用方法

import LoadingText from "../components/LoadingText"
import PageToRefresh from "../components/PageToRefresh"
import FooterBar from "../components/FooterBar"
class PageToRefreshController {onScrollTop = () => {}
}
@Entry
@Component
struct Index {//滚动回顶部方法startprivate PageToRefreshRef = new PageToRefreshController();onScrollTop(){this.PageToRefreshRef.onScrollTop()}//滚动回顶部方法endonSearch() {// 刷新数据this.loading = true;setTimeout(()=>{this.loading = false;this.simpleList = [1, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14,15]},1000)}onReachBottom(){// 触底加载if(!this.finish){this.loading = true;setTimeout(()=>{this.loading = false;this.finish = true;this.simpleList = this.simpleList.concat([16,17,15,19,20,21,22,23,24,25,26,27,28,29,30])},1000)}}// 判断是否需要显示滚动到顶部的按钮(scroll滚动的位置)@State scrollY:number = 0;// 数据@State simpleList: Array<number> = [1, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14,15];@State loading:boolean = false;@State finish:boolean = false;build() {Stack({ }) {Flex({ direction: FlexDirection.Column }) {// 顶部Column(){// 自定义顶部的组件Text('顶部标题').fontColor(0xffffff).fontSize(14)}.width('100%').padding(10).flexShrink(0).backgroundColor(0xFC5531).expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])// 内容Stack(){//调用组件PageToRefresh({controller: this.PageToRefreshRef, scrollY: this.scrollY, refreshPull: () => {this.onSearch()}, reachBottom: () =>{this.onReachBottom()}}){Column(){Row(){// 自定义内容Text('这里可以定义滚动后固定在顶部的内容').fontColor(0xffffff).fontSize(14)}.width('100%').height(50).backgroundColor(0x232020).justifyContent(FlexAlign.Center)List() {ForEach(this.simpleList, (item: number, index: number) => {ListItem(){Row(){Text(item.toString()).fontColor(0xffffff).fontSize(24)}.width('100%').height(80).backgroundColor(0x1BA035).margin({bottom: 10}).justifyContent(FlexAlign.Center)}}, (item: number) => item.toString())ListItem(){LoadingText({loading: this.loading, finish: this.finish, onPullData: () => {//点击直接加载数据this.onReachBottom()}})}}}.alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.Start).constraintSize({minHeight: '100%'})}if(this.scrollY >= 50){Row(){Text('我已经固定在顶部啦').fontColor(0xffffff).fontSize(14)}.position({x:0,y:0}).width('100%').height(50).backgroundColor(0x232020).justifyContent(FlexAlign.Center)}}.flexGrow(1).flexShrink(1)//你自定义的底部tabbar组件(仅供示例)FooterBar({scrollTop: this.scrollY >= 500, //判断是否显示滚动到顶部onGoTop: () => {//点击滚动到顶部的方法this.onScrollTop();}}).flexShrink(0)}.width('100%').height('100%')}}
}

新建PageToRefresh 组件

import LoadingText from "./LoadingText"
class PageToRefreshController {onScrollTop = () => {}
}
@Component
export default struct PageToRefresh {refreshPull?: () => voidreachBottom?: () => voidscroller: Scroller = new Scroller()private controller: PageToRefreshController = new PageToRefreshController();aboutToAppear() {if (this.controller) {this.controller.onScrollTop = this.onScrollTop;}}private onScrollTop = () => {//滚动回顶部this.scroller.scrollTo({ xOffset: 0, yOffset: 0, animation: { duration: 1000, curve: Curve.Ease } })}@Link scrollY: numberprivate currentOffsetY: number = 0;@State refreshStatus: boolean = false;@State refreshText: string = '正在刷新';@State pullUpText: string = '正在加载';@State isRefreshing: boolean = false;@State isCanLoadMore: boolean = false;@State ArrData: string[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];@State newArr: string [] = ['10', '11']putDownPullUpRefresh(event?: TouchEvent): void {if (event === undefined) {return;}switch (event.type) {case TouchType.Down:this.currentOffsetY = event.touches[0].y;break;case TouchType.Move:let isDownPull = event.touches[0].y - this.currentOffsetY > 50;if (isDownPull && this.isCanLoadMore === false && this.scrollY <= 20) {this.refreshStatus = true;}if(this.scroller.isAtEnd()){console.log('滚动到底部')this.isCanLoadMore = true;}break;case TouchType.Cancel:break;case TouchType.Up:if (this.refreshStatus) {console.log('下拉刷新')this.refreshStatus = false;if(this.refreshPull) this.refreshPull();}if (this.isCanLoadMore) {console.log('上拉加载')this.isCanLoadMore = false;if(this.reachBottom) this.reachBottom();}break;default:break;}}@BuilderputDown() {Row() {LoadingText({loading: true, finish: false, loadingText: this.refreshText})}.justifyContent(FlexAlign.Center).width('100%')}@BuilderPullUp() {Row() {LoadingText({loading: true, finish: false, loadingText: this.pullUpText})}.justifyContent(FlexAlign.Center).width('94%').height('5%')}@Builderslot() {Stack(){}.flexShrink(0)};@BuilderParam component: () => void = this.slot;build() {Column() {Scroll(this.scroller) {Column() {if (this.refreshStatus) {this.putDown()}this.component();}}.width('100%').onWillScroll(() => {this.scrollY = this.scroller.currentOffset().yOffset;}).onTouch((event?: TouchEvent) => {this.putDownPullUpRefresh(event);})}.width('100%').height('100%').backgroundColor(0xf4f4f4)}
}

加载文字

@Component
export default struct LoadingText {onPullData?: () => void@Prop loadingText: string = "加载中...";@Prop loading: boolean = false;@Prop finishText: string = "- 我是有底线的 -";@Prop finish: boolean = false;build() {Row() {if(this.loading){LoadingProgress().width(20).height(20).margin({ right: 10 }).color(0x999999)Text(this.loadingText).fontSize(12).fontColor(0x999999).margin({left: 4})}else if(this.finish){Text(this.finishText).fontSize(12).fontColor(0x999999)}else{Text("轻轻上拉加载更多").fontSize(12).fontColor(0x999999).onClick(()=>{if (this.onPullData) {this.onPullData()}})}}.alignItems(VerticalAlign.Center).justifyContent(FlexAlign.Center).width('100%').height(24)}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上传自己的镜像到docker hub详细教程

上传自己的镜像到docker hub详细教程 本博客通B站视频一致&#xff1a; 上传自己的镜像到docker hub详细教程 1. 登录自己的hub.docker.com的账号 docker hub仓库 2. 点击Repositories&#xff0c;跳转到创建仓库页面 3. 点击Create a repository 创建repository&#xff0c…

[AI部署-tensorRT] customlayer定义添加过程解析

文章目录 tensorRT添加自定义层步骤1. trt如何解析onnx的&#xff1f; 整体流程图2. builtin_op_importor是干什么的&#xff1f;3. 怎么添加trt plugin4. 如何进行量化collection过程 references nvidia 官方plugin文档&#xff1a; https://www.nvidia.cn/content/dam/en-zz/…

[Do374]Ansible一键搭建sftp实现用户批量增删

[Do374]Ansible一键搭建sftp实现用户批量增删 1. 前言2. 思路3. sftp搭建及用户批量新增3.1 配置文件内容3.2 执行测试3.3 登录测试3.4 确认sftp服务器配置文件 4. 测试删除用户 1. 前言 最近准备搞一下RHCA LV V,外加2.9之后的ansible有较大变化于是练习下Do374的课程内容. 工…

易语言文字识别OCR

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

Docker 镜像制作原理 做一个自己的docker镜像

一.手动制作镜像 启动容器进入容器定制基于容器生成镜像 1.启动容器 启动容器之前我们首先要有一个镜像&#xff0c;这个镜像可以是从docker拉取&#xff0c;例如&#xff1a;现在pull一个ubuntu镜像到本机。 docker pull ubuntu:22.04 我们接下来可以基于这个容器进行容器…

网络编程 - - TCP套接字通信及编程实现

概述 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。在网络编程中&#xff0c;TCP常用于实现客户端和服务器之间的可靠数据传输。本文将基于C语言实现TCP服务端和客户端建立通信的过程。 三次握手 在…

近红外简单ROI分析matlab(NIRS_SPM)

本次笔记主要想验证上篇近红外分析是否正确&#xff0c;因为叠加平均有不同的计算方法&#xff0c;一种是直接将每个通道的5分钟实时长单独进行叠加平均&#xff0c;另一种是将通道划分为1分钟的片段&#xff0c;将感兴趣的通道数据进行对应叠加平均&#xff0c;得到一个总平均…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…

Python调用go语言编译的库

要在 Python 中调用用 Go 语言编写的库&#xff0c;可以使用 Go 语言的 cgo 特性将 Go 代码编译成共享库&#xff08;如 .so 文件&#xff09;&#xff0c;然后在 Python 中通过 ctypes 或 cffi 模块加载和调用这个共享库。 新建main.go文件&#xff0c;使用go语言编写如下代码…

学成在线_内容管理模块_创建模块工程

学成在线模块工程 1.各个微服务依赖基础工程2.每个微服务都是一个前后端分离的项目3.xuecheng-plus-content&#xff1a;内容管理模块工程xuecheng-plus-content-modelxuecheng-plus-content-servicexuecheng-plus-content-api 1.各个微服务依赖基础工程 2.每个微服务都是一个前…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

智能科技与共情能力加持,哈曼重新定义驾乘体验

2025年1月6日&#xff0c;拉斯维加斯&#xff0c;2025年国际消费电子展——想象一下&#xff0c;当您步入一辆汽车&#xff0c;它不仅能响应您的指令&#xff0c;更能理解您的需求、适应您的偏好&#xff0c;并为您创造一个独特且专属的交互环境。作为汽车科技领域的知名企业和…

Unity中实现倒计时结束后干一些事情

问题描述&#xff1a;如果我们想实现在一个倒计时结束后可以执行某个方法&#xff0c;比如挑战成功或者挑战失败&#xff0c;或者其他什么的比如生成boss之类的功能&#xff0c;而且你又不想每次都把代码复制一遍&#xff0c;那么就可以用下面这种方法。 结构 实现步骤 创建一…

从0开始学习搭网站第二天

前言&#xff1a;今天比较惭愧&#xff0c;中午打铲吃了一把&#xff0c;看着也到钻二了&#xff0c;干脆顺手把这个赛季的大师上了&#xff0c;于是乎一直到网上才开始工作&#xff0c;同样&#xff0c;今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

STM32 FreeRTOS时间片调度---FreeRTOS任务相关API函数---FreeRTOS时间管理

目录 时间片调度简介 FreeRTOS任务相关API函数介绍 延时函数介绍 时间片调度简介 在FreeRTOS中&#xff0c;同等优先级的任务会轮流分享相同的CPU时间&#xff0c;这个时间被称为时间片。在这里&#xff0c;一个时间片的长度等同于SysTick中断的周期。 FreeRTOS任务相关API…

VM(虚拟机)和Linux的安装

文章目录 1.虚拟机1.1 VM的安装和删除1.1.1 安装前提1.1.2 安装步骤 1.2 虚拟机快照1.3 虚拟机的克隆 2.Linux的安装2.1 CentOS2.2 Ubuntu 1.虚拟机 &#xff08;1&#xff09;Linux系统的安装方式 ①物理机安装&#xff1a;直接将操作系统安装到服务器硬件上 ②虚拟机安装&am…

C++算法第十五天

复习周终于结束了&#xff0c;这也是复习周结束后的第一篇文章&#xff0c;请各位小伙伴们细细品尝&#xff0c;废话不多说&#xff0c;我们开始今天的讲解。 第一题 题目链接 918. 环形子数组的最大和 - 力扣&#xff08;LeetCode&#xff09; 题目解析 代码原理 注意&…

mysql-5.7.18保姆级详细安装教程

本文主要讲解如何安装mysql-5.7.18数据库&#xff1a; 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图&#xff0c;该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件&#xff0c;文件内容及各配置项内容如下图&#xff0c;需要先将配置项【skip-grant-tab…

<OS 有关>Ubuntu 24 安装 openssh-server, tailscale+ssh 慢增加

更新日志&#xff1a; Created on 14Jan.2025 by Dave , added openssh-server, tailescape Updated on 15Jan.2025, added "tailescape - tailscape ssh" 前期准备&#xff1a; 1. 更新可用软件包的数据库 2. 升级系统中所有已安装的软件包到最新版本 3. 安装 cur…

STM32-keil安装时遇到的一些问题以及解决方案

前言&#xff1a; 本人项目需要使用到STM32,故需配置keil 5&#xff0c;在配置时遇到了以下问题&#xff0c;并找到相应的解决方案&#xff0c;希望能够为遇到相同问题的道友提供一些解决思路 1、提示缺少&#xff08;missing&#xff09;version 5编译器 step1&#xff1a;找…