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

鸿蒙实现可以上下左右滑动的表格-摆脱大量ListScroller

鸿蒙实现可以上下左右滑动的表格-摆脱大量ListScroller

前言: 好久没写过文章了,最近在开发鸿蒙项目,于是乎想简单记录一下开发过程中遇到的一些好玩的东西或者经常会遇到的功能开发。

开发过程中经常遇到需要做可以上下左右滑动的类型的表格的实现,写之前也在华为论坛搜索了下相关的,官方文档提供了一种方案,创建了大量的ListScroller,个人感觉数据量大了就不是很好用,这里提供一种自己实现的方案

鉴于这个功能难度不是很大,仅仅就是布局和联动的实现,所以代码很少

效果

废话不多说,先上效果

由于CSDN上传gif失败,这里使用之前flutter 实现可以上下左右滑动的表格中的效果,和鸿蒙是一模一样的
在这里插入图片描述

布局

根据表格滑动的结构,可以看到布局结构如下,分别是横向滑动的标题,横向滑动的内容和上下滑动的标题+内容。

在这里插入图片描述

完整代码如下


@Entry
@ComponentV2
struct Index {leftWidth: number = 140cellWidth: number = 120cellHeight: number = 60titleHeight: number = 50private titleScroller: Scroller = new Scroller()private contentScroller: Scroller = new Scroller()private leftScroller: Scroller = new Scroller()private rightScroller: Scroller = new Scroller()titleList: string[] = []leftData: string[] = []rightData: string[] = []aboutToAppear(): void {for (let index = 0; index < 20; index++) {this.titleList.push(`标题${index}`)}for (let index = 0; index < 100; index++) {this.leftData.push(`左侧${index}`)this.rightData.push(`右侧行${index}`)}}build() {Column() {Row() {Text('标题').width(this.leftWidth).height(this.titleHeight).padding({ left: 16 })Scroll(this.titleScroller) {Row() {ForEach(this.titleList, (item: string) => {Text(item).width(this.cellWidth).height(this.titleHeight)})}}.layoutWeight(1).scrollBar(BarState.Off).edgeEffect(EdgeEffect.None).scrollable(ScrollDirection.Horizontal).onScrollFrameBegin((offset: number) => {this.contentScroller.scrollTo({xOffset: this.titleScroller.currentOffset().xOffset + offset,yOffset: 0,animation: false})return { offsetRemain: offset }})}.height(this.titleHeight)Column() {Row() {List({ scroller: this.leftScroller }) {Repeat<ESObject>(this.leftData).virtualScroll().each((ri: RepeatItem<ESObject>) => {ListItem() {Text(ri.item)}.height(this.cellHeight).width(this.leftWidth).itemBorder().align(Alignment.Start).padding({ left: 16 })})ListItem().height(this.cellHeight)}.width(this.leftWidth).enableScrollInteraction(true).scrollBar(BarState.Off).edgeEffect(EdgeEffect.None).cachedCount(20).onScrollFrameBegin((offset: number) => {this.rightScroller.scrollTo({xOffset: 0,yOffset: this.leftScroller.currentOffset().yOffset + offset,animation: false})return ({ offsetRemain: offset })})Column() {Scroll(this.contentScroller) {List({ scroller: this.rightScroller }) {Repeat<string>(this.rightData).virtualScroll().each((ri: RepeatItem<ESObject>) => {ListItem() {Row() {ForEach(this.titleList, (item: string, index: number) => {Text(`${ri.item}${index}`).width(this.cellWidth).height(this.cellHeight)})}}.height(this.cellHeight).itemBorder()})ListItem().height(this.cellHeight)}.cachedCount(20).enableScrollInteraction(true).scrollBar(BarState.Off).edgeEffect(EdgeEffect.None).onScrollFrameBegin((offset: number) => {this.leftScroller.scrollTo({xOffset: 0,yOffset: this.rightScroller.currentOffset().yOffset + offset,animation: false})return ({ offsetRemain: offset })})}.scrollBar(BarState.Off).edgeEffect(EdgeEffect.None).scrollable(ScrollDirection.Horizontal).onScrollFrameBegin((offset: number) => {if (!this.contentScroller.isAtEnd()) {this.titleScroller.scrollTo({xOffset: this.contentScroller.currentOffset().xOffset + offset,yOffset: 0,animation: false})}return { offsetRemain: offset }})}.layoutWeight(1)}}}.height('100%').width('100%')}
}@Styles
function itemBorder() {.border({color: '#cccccc',width: {left: 0,top: 0,right: 0,bottom: 1}})
}
http://www.dtcms.com/a/495219.html

相关文章:

  • 笔试强训:Week -2
  • webpack - 单独打包指定JS文件(因为不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方便运维部署的时候对IP做修改)
  • 有的网站打开的是html结尾的路径有的不是wordpress放在二级目录
  • 展示型企业网站设计方案2016年做网站能赚钱
  • 【论文精读】RD-Agent-Quant:基于多智能体框架的量化因子与模型研发自动化系统
  • 网站开发大概价格建设电子商务网站流程
  • Python 练习脚本(从基础到高级150个练习)
  • GDDR6总结(1)-背景及优劣
  • Redis 中文学习手册
  • 网站改版 程序变了 原来的文章内容链接地址 打不开怎么办以百度云做网站空间
  • iOS 混淆工具链实战,多工具组合完成 IPA 混淆与加固(iOS混淆|IPA加固|无源码混淆|App 防反编译)
  • 莞城做网站wordpress 插件数据
  • YouTube 视频评论,并插入 MySQL
  • mac idea 点击打开项目卡死
  • 网站建设座谈会上的发言wordpress显示文章点击量
  • 室内设计效果图网站推荐在线玩网页游戏h5网站大全
  • C# 仿QQ聊天功能实现 (SQL Server数据库)
  • TensorFlow深度学习实战——节点分类
  • scipy的统计学库(4):用rv_histogram类实现随机抽样
  • Element Plus el-table 默认勾选行的方法
  • Linux系统函数opendir、closedir、readdir详解及案例(自定义ls工具)
  • 便捷网站建设哪家便宜网站建没有前景
  • 接口测试 | Postman的高级用法的测试使用
  • TR3--Transformer之pytorch复现
  • Traccar本地文件包含漏洞(CVE-2025-61666)
  • 建站网站推荐icp域名备案查询系统
  • 智能美颜引擎:美颜SDK如何实现自适应芯片性能优化
  • Java中的boolean与Boolean
  • Flutter高级进阶教程(视频教程)
  • Rocketmq 分布式事务 两阶段提交