HarmonyOS开发案例:【卡片二级联动】

1 卡片介绍

使用ArkTS语言,实现一个导航与内容二级联动的效果。

2 标题

二级联动(ArkTS)

3 介绍

介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能:

  1. 切换左侧导航,右侧滚动到对应的内容。
  2. 滚动右侧的内容,左侧会切换对应的导航。

效果如图所示:

相关概念

  • List\]:列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。

4 环境搭建

软件要求

  • DevEco Studio\]版本:DevEco Studio 3.1 Release。

硬件要求

  • 开发板类型:[润和RK3568开发板]。
  • OpenHarmony系统:3.2 Release。

环境搭建

完成本篇Codelab我们首先要完成开发环境的搭建,本示例以RK3568开发板为例,参照以下步骤进行:

  1. 获取OpenHarmony系统版本\]:标准系统解决方案(二进制)。以3.2 Release版本为例: ![](https://file.jishuzhan.net/article/1787655473076375554/2596016d7d0a042cfffee9783f029d76.webp)

    1. 完成DevEco Device Tool的安装

    2. 完成RK3568开发板的烧录

  2. 搭建开发环境。

    1. 开始前请参考[工具准备],完成DevEco Studio的安装和开发环境配置。
    2. 开发环境配置完成后,请参考[使用工程向导]创建工程(模板选择"Empty Ability")。
    3. 工程创建完成后,选择使用[真机进行调测]。
    4. 鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。

5 代码结构解读

本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在gitee中提供。

复制代码
├──entry/src/main/ets                // 代码区
│  ├──common
│  │  └──constants
│  │     └──Constants.ets            // 常量类
│  ├──entryability
│  │  └──EntryAbility.ts             // 程序入口类
│  ├──pages
│  │  └──IndexPage.ets               // 二级联动页面入口
│  ├──view
│  │  ├──ClassifyItem.ets            // 课程分类组件
│  │  └──CourseItem.ets              // 课程信息组件
│  └──viewmodel                          
│     ├──ClassifyModel.ets           // 导航Model
│     ├──ClassifyViewModel.ets       // 导航ViewModel
│     ├──CourseModel.ets             // 课程内容Model
│     └──LinkDataModel.ets           // 数据源Model
└──entry/src/main/resources          // 资源文件

`HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿`

6 二级联动实现

界面整体使用Row组件实现横向布局,分为左右两部分。均使用List组件实现对导航和内容的数据展示,导航部分固定宽度,内容部分自适应屏幕剩余宽度并用ListItemGroup完成每个导航下的内容布局。

复制代码
Row() {
  List({ scroller: this.classifyScroller }) {
    ForEach(this.classifyList, (item: ClassifyModel, index: number) => {
      ListItem() {
        ClassifyItem({
          classifyName: item.classifyName,
          isSelected: this.currentClassify === index,
          onClickAction: () => this.classifyChangeAction(index, true)
        })
      }
    }, (item: ClassifyModel) => item.classifyName + this.currentClassify)
  }

  List({ scroller: this.scroller }) {
    ForEach(this.classifyList, (classifyItem: ClassifyModel) => {
      ListItemGroup({
        header: this.ClassifyHeader(classifyItem.classifyName),
        space: Constants.COURSE_ITEM_PADDING
      }) {
        ForEach(classifyItem.courseList, (courseItem: CourseModel) => {
          ListItem() {
            CourseItem({ itemStr: JSON.stringify(courseItem) })
          }
        }, courseItem => courseItem.courseId)
      }
    }, item => item.classifyId)
  }
  .sticky(StickyStyle.Header)
  .layoutWeight(1)
  .edgeEffect(EdgeEffect.None)
  .onScrollIndex((start: number) => this.classifyChangeAction(start, false))
}

点击左侧导航时,右侧内容区域通过scrollToIndex方法跳转到对应的内容页面,并改变导航的选中状态。同理在滚动右侧内容的过程中,如果当前展示的ListItemGroup发生改变时,修改左侧导航的选中状态,并滚到到对应的导航item。

复制代码
classifyChangeAction(index: number, isClassify: boolean) {
  if (this.currentClassify !== index) {
    // change the classify status
    this.currentClassify = index;
    if (isClassify) {
      // scroll the course scroll
      this.scroller.scrollToIndex(index);
    } else {
      // scroll the classify scroll
      this.classifyScroller.scrollToIndex(index);
    }
  }
}
相关推荐
程序员飞哥1 小时前
90后大龄程序员失业4个月终于上岸了
后端·面试·程序员
Cyeam2 小时前
爆火的 OpenClaw,赢在生态创新
程序员·开源·openai
databook4 小时前
别让AI代码,变成明天的技术债
人工智能·程序员·ai编程
NineData6 小时前
从业务库到实时分析库,NineData构建MySQL到SelectDB同步链路
数据库·mysql·程序员
UnicornDev6 小时前
【HarmonyOS 6】空状态页面布局设计
华为·harmonyos·arkts·鸿蒙·鸿蒙系统
risc1234568 小时前
复杂社会需要更强的系统整合能力
鸿蒙系统
掉头发的王富贵10 小时前
【2026.3.28深圳腾讯云线下活动分享】我用龙虾3分钟完成了文章的抓取,写作,发布一条龙
程序员·线下活动·腾讯
阿里嘎多学长12 小时前
2026-03-27 GitHub 热点项目精选
开发语言·程序员·github·代码托管
我要改名叫嘟嘟12 小时前
一个大龄程序员的地铁日记(第8期),给予我影响,帮助我改变的书
程序员
陈随易12 小时前
农村程序员聊五险一金
前端·后端·程序员