ArkUI-List组件

列表是一个复杂的容器,当列表项达到一定数量,使得列表内容超出其范围的时候,就会自动变为可以滚动。列表适合用来展现同类数据类型。

List组件支持使用,条件渲染,循环渲染,懒加载等渲染控制方式生成子组件。

List的布局与约束

List提供垂直方向或者水平方向的布局能力,当其内容超出List本身最大的范围后,其字内容便会可以滚动,初次之外,List还提供了交叉轴方向上自适应排列个数布局的能力。

例如一个纵向的List,可以有一列,同时也可以有多列。

一个横向的List,一般有一行,但是也可以存在多行

以上布局,事实上Grid和WaterFlow两种布局都可以达到,但是如果一个布局的子组件每一个列,宽,长宽全部一致。这里推荐用List。 如果需要每个子组件长宽不一致甚至是随机自适应等情况则才考虑使用Grid 或者 WaterFlow。

约束

指的是List组件的长宽约束。一般是,如果List没有指定大小的情况下,List的长宽规则是,子组件是否能撑到List布局的极限, 到了极限, 也就是list没有指定大小,但是List的父组件已经确定大小了,或者通过父组件计算出List只能撑到某一个大小了。 这种情况下, list中子组件少到不足以撑开的时候,list的大小就是子组件合起来的大小,当子组件的量大了,大到list最大值的时候,List到最大就不变了,内容变为可滚动。

List的基本使用方法

List组件的构建声明是这个样子的

List(value?: {space?:number | string, initiallIndex?: number, scroller?: Scroller})

参数详解:

  • space: 代表子项中挨着的间距。
  • initiallIndex: 代表首次进列表的时候初始滑动的位置,单位按照索引来进行测算。自动滑动的位置为 置顶第一个。
  • scroller: 可滚动组件控制器(所以不止一个组件欧)。 如果一个List有滑动控制的需求,例如点击某一个按钮就会向上移动多少,此时,没有办法直接拿到List的对象去滑动,而是通过滑动控制器绑定完进行控制。

initiallIndex使用案例:

@State list:string[] = ['1', '2', '3', '4', '5', '6', '7']
build() {...List({space: 8, initiallIndex: 3}){ForEach(this.list, (item: string) => {....}, (item: string) => item)}
}

可滚动组件控制器-Scroller

上方我们讲了下List组件构建的时候所需要的参数,其余两个,space, 和 initiallIndex都比较好理解,我们不做赘述。 下面讲讲第三个参数Scroller。

Scroller就是用来控制可滚动组件的滚动行为的。List也是一种可滚动组件,也支持了这个控制器。

Scroller初始化

非常简单,new一下即可。

// 1 初始化对象
scroller: Scroller = new Scroller()// 2 使用对象
build() {...List({space: 8, initiallIndex: 3, scroller: this.scroller}){ForEach(this.list, (item: string) => {....}, (item: string) => item)}
}

Scroller功能

  • scrollTo :滑动到指定位置
  • scrollEdge: 滑动到边缘
  • scrollBy:滑动指定距离

// 1 初始化对象
scroller: Scroller = new Scroller()// 2 使用对象
build() {...List({space: 8, initiallIndex: 3, scroller: this.scroller}){ForEach(this.list, (item: string) => {....}, (item: string) => item)}Button('scroll 50').onclick(()=>{this.scroller.scrollBy(0, 50)})Button('back top').onclick(()=>{this.scroller.scrollEdge(Edge.Top)})
}

List属性

属性

功能

listDirection

设置List组件排列方向

lanes

设置List组件行数或者列数

divider

设置ListItem分割线样式

scrollBar

设置滚动条状态

alignListItem

设置Item对齐方式,有时候List的每一个项远远大于Item组件的大小,此时就需要对齐了

sticky

指定ListItemGroup什么部分作为粘性标题

swipeAction

指定侧滑方式

listDirection属性-设置列表方向

用于设置List组件的内容排列方向。 其值为一个枚举:

  • Axis.Vertical 纵向
  • Axis.Horizontal 横向
// 1 初始化对象
scroller: Scroller = new Scroller()// 2 使用对象
build() {...List({space: 8, initiallIndex: 3, scroller: this.scroller}){ForEach(this.list, (item: string) => {....}, (item: string) => item)}.listDirection(Axis.Vertical)
}

lanes属性-设置列数

lanes是车道,划分区域的意思。这个属性设置的时候参数比较复杂。我们看看原型。

lanes(value: number|LengthConstrain, gutter?: Dimension)

  • value: 设置列表内容的列数或者行数。这个行数可以为number用于指定是什么列,也可以为LengthConstrain类型,用于指定,每一个列的最小值和最大值,使得根据父容器大小,来动态度的计算应该需要几列。
  • gutter: 设置列间距。 此处的列间距,应该变通理解,如果一个表目前是横向的,那么它只有一个横向的”列“!
// 1 初始化对象
scroller: Scroller = new Scroller()// 2 使用对象
build() {...List({space: 8, initiallIndex: 3, scroller: this.scroller}){ForEach(this.list, (item: string) => {....}, (item: string) => item)}.listDirection(Axis.Vertical).lanes(2)
}

List是纵向的,出现了两列

value为LengthConstrain类型时的使用方式
// 1 初始化对象
scroller: Scroller = new Scroller()
// 目标就是使得列表排列的好看,假如宽为300, 则会有一列, 假如宽为400,则两列正好,也符合最小
// 标准,就会展示两列
@State lenthConstrains: LengthConstrains = {minLength: 200, maxLength: 300}// 2 使用对象
build() {...List({space: 8, initiallIndex: 3, scroller: this.scroller}){ForEach(this.list, (item: string) => {....}, (item: string) => item)}.listDirection(Axis.Vertical).lanes(this.lenthConstrains)
}

divider属性-设置分割线样式

// 1 初始化对象
scroller: Scroller = new Scroller()// 2 使用对象
build() {...List({space: 8, initiallIndex: 3, scroller: this.scroller}){ForEach(this.list, (item: string) => {....}, (item: string) => item)}.listDirection(Axis.Vertical).lanes(2).divider({strockWidth: 2,color: '#4472c4',startMargin: 20,endMargin: 20})
}

scrollBar属性-设置滚动条状态

这个比较好理解就不做代码展示了。我们理解下参数的意义即可。

scrollBar(barState: BarState)

BarState枚举说明

  • Auto:按需展示,触摸时展示,2秒后就消失。
  • Off:不展示
  • On:常驻展示、

List,ListItemGroup, ListItem 组件关系

ListItemGroup用于列表数据的分组展示,其组件也是ListItem。ListItem表示单个列表项,可以包含单个组件。

list(){listItemGroup(){listItem(){...}}listItemGroup(){listItem(){...}listItem(){...}}listItemGroup(){listItem(){...}listItem(){...}}
}

粘性标题分组列表

分组列表不好解释,但是我们看一张图就明白其中的意思了

首先,我们要实现分组的效果,之后再加粘性标题,如果如右侧图片,在右侧栏加上导航,可以再加一个额外的组件做。有现成的组件,当然也可以自己写。

1 首先分组

可以用ListItemGroup来做这件事情,ListItemGroup本身支持加一些header的,我们可以把分组做成header。

@Builder itemHeader(title: string){// 列表分组的头部组件,对应联系人分组A、B等位置的组件Text(text).fontSize(20).backgroundColor('#fff1f3f5').width('100%').padding(5)
}build() {List() {ListItemGroup({ header: this.itemHeader('A') }) {// 循环渲染分组A的ListItem}ListItemGroup({ header: this.itemHeader('B') }) {// 循环渲染分组B的ListItem}}
}

当然这是较为低级的写法,通常我们会列好数据结构,用ForEach层层循环渲染即可。

2 添加粘性标题

粘性标题也是我们生活中经常用到的一种交互方式。

如下图所示,在联系人列表中滚动A部分时,B部分开始的头部元素始终处于A的下方。而在开始滚动B部分时,B的头部会固定在屏幕顶部,直到所有B的项均完成滚动后,才被后面的头部替代。

List为我们提供了这种交互,解决方式是:sticky属性,这个属性是用来配合ListItemGroup来使用的。使用起来非常简单。

@Builder itemHeader(title: string){// 列表分组的头部组件,对应联系人分组A、B等位置的组件Text(text).fontSize(20).backgroundColor('#fff1f3f5').width('100%').padding(5)
}build() {List() {ListItemGroup({ header: this.itemHeader('A') }) {// 循环渲染分组A的ListItem}ListItemGroup({ header: this.itemHeader('B') }) {// 循环渲染分组B的ListItem}}
}.sticky(StickyStyle.Header)

如果需要底吸功能需要

  • 初始化ListItemGroup的Footer
  • 将sticky绑定为StickyStyle.Footer

3 响应滚动位置

控制滚动位置

如果想要完成类似于字母导航的功能,则首先需要回顾一下,滚动到指定位置的方式。前面已经讲解过,我们可以在List声明的时候就设置一个参数,为Scroller。 可以通过调用Scroller的一些方法来让列表滑动到指定的位置。响应滚动位置在一定程度上用到了这里的原理。Scroller里面记录了一个位置数据,这个数据实际上是可以被观察的,同时它也是遵循双向绑定的。

响应滚动位置改变导航,与点击导航跳转到指定位置

HarmonyOs ArkUI为我们提供了一个组件AlphabetIndexer,用来展示一个右侧的索引栏。这里面实现的时候有个有意思的点就是, AlphabetIndexer内部存了一个双向绑定的参数,List中记录的参数衔接上,那么,当List参数变得时候,AlphabetIndexer参数自然会变动,界面也会变动。 当AlphabetIndexer内部检测到用户选择了某个选项,自然也会通过改动这个值, 从而List列表位置自然也变更了。

const alphabels = ['#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K','L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']@Entry
@Component
struct ConstractList{@State selectedIndex: number = 0private listController: Scroller = new Scroller()build() {Stack({ alignContent: Alignment.End }) {List({ scroller: this.listScroller }) {}.onScrollIndex((firstIndex: number) => {// 根据列表滚动到的索引值,重新计算对应联系人索引栏的位置this.selectedIndex})// 字母表索引组件AlphabetIndexer({ arrayValue: alphabets, selected: 0 }).selected(this.selectedIndex)}}
}

响应列表侧滑

我们可以用List的 swipeAction属性去实现列表的侧滑功能,其参数为 SwipeActionOptions来指定是从哪里侧滑。

我们注意到列表项目被侧滑之后,会出现一个删除的按钮,这个按钮是从哪里设置的呢? 实际上,这个swipeAction与我们之前的提到的粘性标题使用方式有异曲同工之处

  • 1 需要指定List框架特定的,已经成为概念的,某界面的内容。 在此处,就是List中已经协议好的,尾端滑出组件,其使用环节位于,ListItem中。
  • 2 仅仅需要设置swipeAction参数就行了。
// 找指定的区域,设置布局
@Builder itemEnd(index: number) {// 构建尾端滑出组件Button({ type: ButtonType.Circle }) {Image($r('app.media.ic_public_delete_filled')).width(20).height(20)}.onClick(() => {// this.messages为列表数据源,可根据实际场景构造。点击后从数据源删除指定数据项。this.messages.splice(index, 1);})
}
ForEach(list, (item: string, index: number)=>{ListItem(){//此处省略很多布局内容}.swipeAction( // 参数是一个SwipeActionOptions, 可以分别指定滑动方向,以及滑动后需要build的界面行为{end: {builder: ()=> this.itemEnd(index)}})
}, (item: string)=> item.toString)

列表辅助红点逻辑控件-Badge

在应用的开发中,红点逻辑必不可少,比如聊天消息,通知等等。几乎大型的App都需要。正常情况下我们自己写控件也可以实现,但是,ArkUI给我们提供好了这种控件,就比较省事了。 控件名字叫 Badge。使用方法比较简单,看看基本就懂了。

ListItem() {Badge({count: 1,position: BadgePosition.RightTop,style: {badgeSize: 16, badgeColor: '#FA2A2D'}}) {// Image组件实现消息联系人头像// ...}
}

数据懒加载

循环列表,适用于短列表,当构建具有大量列表项的长列表时, 如果直接采用循环引用的方式,会使得一次性加载所有的元素,会导致页面启动时间过长,影响用户体验,此时,推荐使用数据懒加载LazyForEach方式按需加载数据,从而提升列表性能。

当使用LazyForEach进行加载时,可以指定列表项的缓存数量

List(){...
}
// 如果是含有ListItemGroup,那么缓存数量就是以group为单位。
// 如果列表是多列的,那么数量就会乘列数。总不能不展示全是不是?
.cachedCount(3) 
  • cachesCount的数量如果设置的太高,会增大UI对CPU的占用,内存开销也会变大,使用时要根据真实情况来定。
  • 列表数据使用懒加载的时候,除了显示界面内的以及前后缓存的列表项数量,其余的列表项是会被销毁的。

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

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

相关文章

Word限定仅搜索中文或英文引号

在Word中,按下CtrlF键,左侧会弹出导航搜索栏; 点击放大镜旁边的下拉栏,选择高级查找 在查找内容处输入英文状态下的",然后选择更多->使用通配符,就可以仅查找英文状态下的" 同理&#xff…

智能飞鸟监测 守护高压线安全

飞鸟检测新纪元:视觉分析技术的革新应用 在现代化社会中,飞鸟检测成为了多个领域不可忽视的重要环节。无论是高压线下的安全监测、工厂内的生产秩序维护,还是农业区的作物保护,飞鸟检测都扮演着至关重要的角色。传统的人工检测方…

React初学分享 事件绑定 组价通信 useState useEffect

React初学 React介绍快速搭建React项目JSXJSX的本质优势:JSX中使用JS表达式JSX中的列表渲染JSX实现简单条件渲染JSX实现复杂条件渲染 React中的事件绑定React基础事件绑定传递自定义参数同时传递事件对象和自定义参数 React中的组件useState修改状态的规则状态不可变…

【实战】deepseek数据分类用户评论数据

在平时的工作中,我们会遇到数据分类的情况,比如将一些文本划分为各个标签。如果人工分类这块的工作量将是非常大,而且分类数据的准确性也不高。我们需要用到一些工具来实现。提高效率的同时也提高准确率。 1.示例数据 用户ID 时间戳 评论场…

git tag以及git

git tag 以及git 一、先说收获吧 1. git bash 在windows上 类似于linux的bash提供的shell命令行窗口,可以执行很多linux命令,cd pwd ls vim cat touch mkdir,还可以用正则匹配查看标签。相当于在windows上装了一个小的linux。git init myproj…

[动手学习深度学习]28. 批量归一化

当前所有的深度学习网络,或多或少都用了批归一化操作 批归一化的思想不新,但是这个特定的层是16年左右出现的,在这之后,发现他对深度学习算法性能的提升非常有效 概念理解 这是一个网络的结构: 当数据很深的时候&am…

AI比人脑更强,因为被植入思维模型【17】万物联系思维模型

万物联系,万物,并不孤立。 定义 万物联系思维模型是一种强调世界上所有事物都相互关联、相互影响的思维方式。它认为任何事物都不是孤立存在的,而是与周围的环境、其他事物以及整个宇宙构成一个有机的整体。这种联系不仅包括直接的因果关系,还涵盖了间接的、潜在的、动态的…

昆仑技术重构AI大模型落地范式,长期作“加法”迎来国产生态化“拐点”

作者 | 曾响铃 文 | 响铃说 DeepSeek的爆火,在业内迅速掀起了一场国产化的变革。“国产大模型国产算力”软硬协同的范式正在被重构,AI产业国产化的含金量持续提升,越来越多的企业在这一趋势下加速走上数智化转型路径。 其中,以…

【C++初阶】---类和对象(上)

1.类的定义 1.1类的定义格式 • class为定义类的关键字,Data为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。 •…

常见中间件漏洞(tomcat)

CVE-2017-12615 当在Tomcat的conf(配置目录下)/web.xml配置文件中添加readonly设置为false时,将导致该漏洞产生,(需要允许put请求) , 攻击者可以利用PUT方法通过精心构造的数据包向存在漏洞的服务器里面上传…

NSSCTF(MISC)——[NSSRound#4 SWPU]Type Message

相应的做题地址:https://www.nssctf.cn/problem/2478 得到4个wav文件 使用DTMF Decoder工具,对D.wav进行识别 随波逐流,发现九宫格键盘解码能够得到flag 对其他3个文件依次进行识别解码 最终得到fNSSCTF{DTMFISREALLYEASY}

C++核心语法快速整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要为学过多门语言玩家快速入门C 没有基础的就放弃吧。 全部都是精华,看完能直接上手改别人的项目。 输出内容 std::代表了这里的cout使用的标准库,避免不同库中的相同命名导致混乱 …

Matplotlib完全指南:数据可视化从入门到实战

目录 引言 一、环境配置与基础概念 1.1 安装Matplotlib 1.2 导入惯例 1.3 两种绘图模式 二、基础图形绘制 2.1 折线图(Line Plot) 2.2 柱状图(Bar Chart) 三、高级图表类型 3.1 散点图(Scatter Plot&#xff…

C++:IO库

一、C IO库的架构 C标准库中的IO系统基于流(Stream)​的概念,分为三层结构: ​流对象​(如cin, cout, fstream)​流缓冲区​(streambuf,负责底层数据处理)​数据源/目的…

【STM32】SPI通信外设硬件SPI读写W25Q64

【STM32】SPI通信协议&W25Q64Flash存储器芯片(学习笔记)-CSDN博客 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担可配置8位/16位数据帧、高位先行/…

二叉树之树的高以及遍历

二叉树的高其实很简单就一句话: 从根节点到叶节点的最长路径中的边数就是二叉树的高 int FindHeight(Btree root){int leftheight;int rightheight;if(rootNULL){return -1;}else{leftheightFindHeight(root->left );rightheightFindHeight(root->right );}r…

DeepSeek技术架构解析:MoE混合专家模型

一、前言 2025年初,DeepSeek V3以557万美元的研发成本(仅为GPT-4的1/14)和开源模型第一的排名,在全球AI领域掀起波澜。其核心创新之一——混合专家模型(Mixture of Experts, MoE)的优化设计,不…

VMware主机换到高配电脑,高版本系统的问题

原来主机是i3 ,windows7系统,vmware 14.0,虚机系统是ubuntu 14.04。目标新机是i7 14700KF,windows11系统。原以为安装虚拟机,将磁盘文件,虚拟机配置文件拷贝过去可以直接用。 新目标主机先安装了vmware 15,运行原理虚机&#xff0…

数字化转型驱动卫生用品安全革新

当315晚会上晃动的暗访镜头揭露卫生巾生产车间里漂浮的异物、纸尿裤原料仓中霉变的碎屑时,这一触目惊心的场景无情地撕开了“贴身安全”的遮羞布,暴露的不仅是部分企业的道德缺失,更凸显了当前检测与监管体系的漏洞,为整个行业敲响…

VideoHelper 油猴脚本,重塑你的视频观看体验

VideoHelper 油猴脚本,重塑你的视频观看体验 在日常上网看视频时,你是否也被这些问题困扰:视频网站开头的广告又臭又长,找个合适的播放倍速要在一堆选项里翻半天,每次手动调音量、点全屏按钮繁琐又影响沉浸感&#xf…