鸿蒙开发:如何实现列表吸顶

前言

本文基于Api13

列表吸顶功能,在实际的开发中有着很大的作用,比如可以让列表层级之间更加分明,减少一定程度上的视觉混乱,由于吸顶的标题会随着滚动固定在顶部,可以让用户无需反复滑动回顶部确认分组位置,方便实时定位当前分组,可以说还是非常方便的;常见的场景有联系人的页面,电商软件的购物车等。

鸿蒙当中实现一个列表吸顶,很是简单,官方为我们提供了ListItemGroup组件,使用它,便可以轻松搞定,我们可以先来看一个简单的案例:

interface CityData {name: string;address: string[];
}@Entry
@Component
struct Index {private cityData: CityData[] = [{name: '北京市',address: ['朝阳区', '东城区', '西城区']}, {name: '河北省',address: ['石家庄', '保定市', '唐山市']}, {name: '河南省',address: ['郑州市', '商丘市', '洛阳市', '开封市']}, {name: '山西省',address: ['太原市', '晋城市', '大同市', '长治市']}]@BuilderitemHead(text: string) {Text(text).fontSize(18).height(40).fontColor(Color.White).backgroundColor(Color.Orange).width('100%')}//组件使用build() {Column() {List() {ForEach(this.cityData, (item: CityData) => {ListItemGroup({ header: this.itemHead(item.name) }) {ForEach(item.address, (address: string) => {ListItem() {Text(address).width("100%").height(80).fontSize(16).textAlign(TextAlign.Center)}}, (item: string) => item)}.divider({ strokeWidth: 1, color: Color.Gray })})}.width("100%").sticky(StickyStyle.Header).scrollBar(BarState.Off)}.width("100%").height("100%")}
}

运行之后,效果如下:

从以上的案例中我们可以看到,ListItemGroup组件是必须要结合List组件一起使用的,这一点一定要知晓,下面,针对ListItemGroup组件,我们就一起来探究一下吧。

ListItemGroup使用方式

通过源码,我们可以看到,ListItemGroup组件接收了一个ListItemGroupOptions参数。

 /*** Called when interface is called.** @param { ListItemGroupOptions } options* @returns { ListItemGroupAttribute }* @syscap SystemCapability.ArkUI.ArkUI.Full* @crossplatform* @atomicservice* @since 11*/(options?: ListItemGroupOptions): ListItemGroupAttribute;

ListItemGroupOptions可选择的属性如下,一般最常用的就是header属性,也就是吸顶时的标题栏组件。

名称

类型

必填

说明

header

CustomBuilder

ListItemGroup头部组件。

headerComponent13+

ComponentContent

使用ComponentContent类型参数设置ListItemGroup头部组件。

footer

CustomBuilder

设置ListItemGroup尾部组件。

footerComponent13+

ComponentContent

使用ComponentContent类型参数设置ListItemGroup尾部组件。

space

number | string

列表项间距。只作用于ListItem与ListItem之间,不作用于header与ListItem、footer与ListItem之间。

默认值:0

单位:vp

style10+

ListItemGroupStyle

设置List组件卡片样式。

默认值:ListItemGroupStyle.NONE

我们可以把前言中的案例改造一下,加一个footer属性:

ListItemGroup({header: this.itemHead(item.name),footer: this.itemFooter(item.address.length.toString())})

尾部组件视图:

  @BuilderitemFooter(text: string) {Text("一共有" + text + "个地址").fontSize(18).height(20).fontColor(Color.White).backgroundColor(Color.Red).width('100%')}

运行之后,效果如下:

headerComponent和footerComponent参数,和header与footer功能一样,都是用于头或者尾组件,但是,他们的优先级高于后者,也就是如果你同时设置了他们,在实际的效果中会以前者为准。

headerComponent和footerComponent参数接收了一个ComponentContent参数,使用它,我们可以共用一个公共的视图组件,因为它可以接受一个wrapBuilder参数。

比如上述的代码,我们使用headerComponent代替header,运行之后可以发现,其实效果是一样的。

 headerComponent: new ComponentContent(this.getUIContext(), wrapBuilder(buildHeader), item.name)

除此之外,还有一个style属性,使用它,可以实现一个卡片样式的效果:

 style: ListItemGroupStyle.CARD

设置后,会展示如下的卡片效果:

refresh库实现

refresh库是我开发的一个列表刷新加载库,上架一年多来,已经有三万多次的下载量,获得了很多开发者的一致好评,如果您也感兴趣,可以访问如下的refresh库地址,里面有详细的使用方式:

https://ohpm.openharmony.cn/#/cn/detail/@abner%2Frefresh

使用刷新库,实现一个列表吸顶也是非常的简单,具体使用如下:

ListView({controller: this.controller, //刷新控制器itemGroupHeader: this.itemHead, //分组头itemGroupData: this.cityData, //分组数据itemLayout: this.itemLayout, //内容视图onRefresh: () => {setTimeout(() => {//模拟耗时this.controller.finishRefresh()}, 2000)},onLoadMore: () => {setTimeout(() => {//模拟耗时this.controller.finishLoadMore()}, 2000)}})

效果如下:

相关总结

ListItemGroup组件的使用,可以说是非常的简单,如果仅仅是普通的吸顶,建议直接使用即可,如果您需要带有下拉刷新和上拉加载效果的,可以使用refresh组提供的,在使用原生的时候,有一点需要注意,那就是需要设置List组件的sticky属性,否则吸顶效果是不生效的。

.sticky(StickyStyle.Header|StickyStyle.Footer)

StickyStyle属性介绍如下:

名称

说明

None

0

header不吸顶,footer不吸底。

Header

1

header吸顶,footer不吸底。

Footer

2

footer吸底,header不吸顶。

本文标签:HarmonyOS/ArkUI

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

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

相关文章

使用Zotero的RSS订阅功能快速了解感兴趣领域最新文章

文章目录 写在前面中文期刊的RSS订阅英文期刊的RSS订阅回到Zotero有啥用? 写在前面 作为一名研究生或者科研工作者,肯定需要经常检索自己研究领域的最新文献,相比于不定期的去各大数据库检索文献,借助RSS订阅功能则更加便捷。 R…

Windows安装Docker Desktop开启 Kubenetes制作并部署本地镜像

1、安装Docker Desktop docker desktop官方下载链接,下载后一路点下来安装就好了。 2、制作本地镜像 跟着docker步骤制作镜像,需要先配置docker 镜像源,因为网络问题 {"builder": {"gc": {"defaultKeepStorage&…

嵌入式学习笔记 - freeRTOS 列表,链表,节点跟任务之间关系

一 下图说明了 freeRTOS 就绪列表,链表,节点跟任务之间关系 一个任务对应一个节点,一个链表对应一个优先级,一个任务根据优先级可以插入任何一个链表中。 插入函数为,这也是freeRTOS的核心函数,对每个任务…

scikit-learn pytorch transformers 区别与联系

以下是 scikit-learn、PyTorch 和 Transformers 的区别与联系的表格形式展示: 特性/库scikit-learnPyTorchTransformers主要用途传统机器学习算法深度学习框架预训练语言模型与自然语言处理任务核心功能分类、回归、聚类、降维、模型选择等张量计算、自动微分、神经网络构建与…

【C/C++】从零开始掌握Kafka

文章目录 从零开始掌握Kafka一、Kafka 基础知识理解(理论)1. 核心组件与架构2. 重点概念解析 二、Kafka 面试重点知识梳理三、C 使用 Kafka 的实践(librdkafka)1. librdkafka 简介2. 安装 librdkafka 四、实战:高吞吐生…

Spyglass:目标文件(.spq)的结构

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 预备知识 为了方便检查,Spyglass向用户提供Guideware作为检查参考;Guideware又包含各种方法(Methodology),应用于设计的不同阶段&…

一些Dify聊天系统组件流程图架构图

分享一些有助于深入理解Dify聊天模块的架构图 整体组件架构图 #mermaid-svg-0e2XalGLqrRbH1Jy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0e2XalGLqrRbH1Jy .error-icon{fill:#552222;}#mermaid-svg-0e2XalGLq…

地理空间索引:解锁日志分析中的位置智慧

title: 地理空间索引:解锁日志分析中的位置智慧 date: 2025/05/24 18:43:06 updated: 2025/05/24 18:43:06 author: cmdragon excerpt: 地理空间索引在日志分析中应用广泛,涉及用户登录IP定位、移动端位置轨迹和物联网设备位置上报等场景。MongoDB支持2dsphere和2d两种地理…

分库分表深度解析

一、为什么要分库分表? 通常,数据库性能受到如下几个限制: 硬件瓶颈:单机的 CPU、内存、磁盘 I/O 等资源总是有限。例如,当单表中的记录达到上亿、甚至更高时,表扫描、索引维护和数据迁移会变得非常慢。单…

QListWidget的函数,信号介绍

前言 Qt版本:6.8.0 该类用于列表模型/视图 QListWidgetItem函数介绍 作用 QListWidget是Qt框架中用于管理可交互列表项的核心组件,主要作用包括: 列表项管理 支持动态添加/删除项:addItem(), takeItem()批量操作:addItems()…

ModbusRTU转profibusDP网关与RAC400通讯报文解析

ModbusRTU转profibusDP网关与RAC400通讯报文解析 在工业自动化领域,ModbusRTU和ProfibusDP是两种常见的通信协议。ModbusRTU以其简单、可靠、易于实现等特点,广泛应用于各种工业设备之间的通信;而ProfibusDP则是一种高性能的现场总线标准&am…

Python容器

一、容器 1. 列表【】:有序可重复可混装可修改 [元素1,元素2,元素3,...] • 可以容纳多个元素 • 可以容纳不同类型的元素(混装) • 数据是有序存储的(有下标序号) • 允许重复数…

webpack面试问题

一、核心概念 Webpack的构建流程是什么? 答案: 初始化:读取配置,创建Compiler对象编译:从入口文件开始,递归分析依赖关系,生成依赖图模块处理:调用Loader转换模块(如babel-loader)输出:将处理后的模块组合成Chunk,生成最终文件Loader和Plugin的区别? Loader:文件…

uniapp-商城-66-shop(2-品牌信息显示,数据库读取的异步操作 放到vuex actions)

完成页面的显示,但是还需要进行修改,这里涉及到修改中的信息同步显示。也会涉及到数据的读取,修改和同步。 本文介绍了如何使用Vuex管理品牌数据,实现数据的同步显示和修改。主要内容包括:1.将获取品牌数据的异步操作封…

使用Pyinstaller打包python,全过程解析【2025最详细】

一、如何使用 Pyinstaller 打包 Python 程序 1.打开终端 右键点击文件夹空白处,选择 打开于 > 打开终端 2.安装 pyinstaller 在打开的终端中,输入命令【pip install pyinstaller】 使用 Python 包管理工具 pip 来安装 Pyinstaller。等待安装过程结…

GPU加速Kubernetes集群助力音视频转码与AI工作负载扩展

容器编排与GPU计算的结合,为追求性能优化的企业开辟了战略转型的新路径 基于GPU的托管Kubernetes集群不仅是技术选择,更是彻底改变企业处理高负载任务的战略部署方式。 随着人工智能和机器学习项目激增、实时数据处理需求的剧增,以及高性能媒…

LINUX 524 rsync+inotify 调试(问题1:指定端口无法同步/已通过;问题2:rsync.log文件中时间不显示/已显示)

怎么把java文件夹给传过去了 rsync inotify 监控代码实时传输调试 没看到日志 这里面有了 rsync -e"ssh -p 3712" -av /root/app/java/ code192.168.235.100:/home/code/backup/java_backup/ 文件夹后面的/要加上 [rootlocalhost java]# cat /var/log/rsync.log…

Python入门手册:条件判断

条件判断是编程中不可或缺的一部分,它允许程序根据不同的条件执行不同的代码块。Python提供了if、elif和else语句来实现条件判断。通过这些语句,你可以控制程序的流程,使其能够根据不同的情况做出相应的反应。本文将详细介绍Python中的条件判…

x-cmd install | cargo-selector:优雅管理 Rust 项目二进制与示例,开发体验升级

目录 功能亮点安装优势特点适用场景总结 还在为 Rust 项目中众多的二进制文件和示例而烦恼吗?cargo-selector 让你告别繁琐的命令行,轻松选择并运行目标程序! 功能亮点 交互式选择: 在终端中以交互方式浏览你的二进制文件和示例&…

Baklib知识中台高效实践路径

知识中台全周期构建路径 Baklib在构建知识中台全周期管理体系时,以知识价值转化为核心导向,通过三阶段递进实现闭环运作。在知识采集阶段,运用智能爬虫与API接口技术,聚合分散在业务系统、文档库及沟通工具中的碎片化知识资产&am…