HarmonyOS NEXT应用开发案例——二级联动

介绍

本示例主要介绍了List组件实现二级联动(Cascading List)的场景。 该场景多用于短视频中拍摄风格的选择、照片编辑时的场景的选择。

效果图预览

使用说明

  1. 滑动二级列表侧控件,一级列表随之滚动。
  2. 点击一级列表,二级列表随之滚动。

实现思路

  1. 构造懒加载数据源类型MyDataSource

  2. 一二级列表分别绑定不同的Scroller对象,一级列表(tagLists)绑定classifyScroller对象,二级列表绑定scroller对象。

    @Component
    export struct SecondaryLinkExample {
    private classifyScroller: Scroller = new Scroller(); // 一级列表Scroller对象
    private scroller: Scroller = new Scroller(); // 二级列表Scroller对象

    build() {
    ...

     Row() {
       // 一级列表
       List({ scroller: this.classifyScroller, initialIndex: 0 }) {
         ...
       }
     }
    

    }
    }

  3. 通过循环,构造一二级列表数据。

    ForEach(this.tagLists, (item: string, index: number) => {
    ListItem() {
    ...
    }
    })

  4. 点击一级列表后,通过一级列表的索引获取二级列表的索引,调用scrollToIndex方法将一二级列表滚动到指定索引值。

    // 根据一级列表索引值获取二级列表索引值
    findItemIndex(index: number): number {
    return this.records[index];
    }

    build(){
    Column() {
    ...
    }.onClick(() => { // 一级列表点击事件
    this.currentTagIndex = index;
    let itemIndex = this.findItemIndex(index);
    this.scroller.scrollToIndex(itemIndex, true);
    })
    }

  5. 滑动二级列表触发组件滚动事件后,获取到列表可视区域第一个item对应的索引值,通过二级列表索引获取一级列表索引,调用scrollToIndex方法将一级列表滚动到指定索引值。

    @State @Watch('onIndexChange') currentTagIndex: number = 0; // 一级列表焦点索引值
    private isClickTagList: boolean = false; // 是否点击一级列表
    private classifyScroller: Scroller = new Scroller(); // 一级列表Scroller对象

    // 根据二级列表索引值获取对应一级列表索引
    findClassIndex(index: number): number {
    ...
    }

    build() {
    List() {
    ...
    }.onScrollIndex((start: number) => {
    let currentClassIndex = this.findClassIndex(start);
    // 当前二级列表元素是否属于当前一级列表类
    if (currentClassIndex !== this.currentTagIndex && this.isClickTagList !== true) {
    this.currentTagIndex = currentClassIndex;
    this.classifyScroller.scrollToIndex(currentClassIndex, true); // 滚动到指定位置
    }
    })
    }

高性能知识点

本示例使用了LazyForEach进行数据懒加载,List布局时会根据可视区域按需创建ListItem组件,并在ListItem滑出可视区域外时销毁以降低内存占用。

工程结构&模块类型

secondarylinkage                                // har
|---pages
|   |---DataType.ets                            // 数据类型定义 
|   |---SecondaryLinkExample.ets                // 二级联动功能实现页面 

模块依赖

当前场景依赖common模块的FunctionDescription组件,主要用于功能场景文本介绍。详细可参考FunctionDescription文件。

参考资料

LazyForEach详细用法

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:https://qr21.cn/FV7h05

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)

  2. ......

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念

  2. 构建第一个ArkTS应用

  3. ......

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识

  2. 配置文件

  3. 应用数据管理

  4. 应用安全管理

  5. 应用隐私保护

  6. 三方应用调用管控机制

  7. 资源分类与访问

  8. 学习ArkTS语言

  9. ......

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发

  2. UI开发

  3. 公共事件与通知

  4. 窗口管理

  5. 媒体

  6. 安全

  7. 网络与链接

  8. 电话服务

  9. 数据管理

  10. 后台任务(Background Task)管理

  11. 设备管理

  12. 设备使用信息统计

  13. DFX

  14. 国际化开发

  15. 折叠屏系列

  16. ......

鸿蒙开发面试真题(含参考答案):https://qr21.cn/FV7h05

相关推荐
Geeker554 小时前
如何在忘记密码的情况下解锁Android手机?
android·网络·macos·华为·智能手机·电脑·手机
wxx21505 小时前
【android】【adb shell】写一个shell脚本,监听进程pid变化
android·adb
心死翼未伤7 小时前
【MySQL基础篇】多表查询
android·数据结构·数据库·mysql·算法
喂_balabala7 小时前
Android手机拍照或从本地相册选取图片设置头像-高版本适配
android·开发语言
君哥聊技术8 小时前
华为仓颉可以取代 Java 吗?
华为·仓颉
等风来随风飘8 小时前
华为机试HJ37统计每个月兔子的总数
华为
_小马快跑_8 小时前
Android | StandardCharsets.UTF_8.toString() 遇到的兼容问题记录
android
wxx21509 小时前
【Android】【多屏】多屏异显异触调试技巧总结
android
人民的石头11 小时前
Android增量更新----java版
android
XuZhenhao060912 小时前
HarmonyOS - 通过.p7b文件获取fingerprint
华为·harmonyos