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);
    }
  }
}
相关推荐
不要秃头啊5 小时前
别再谈提效了:AI 时代的开发范式本质变了
前端·后端·程序员
jonjia5 小时前
引入新维度化解权衡难题
程序员
jonjia5 小时前
优秀的工程师如何打破规则
程序员
jonjia5 小时前
在大厂交付大型项目的策略
程序员
jonjia5 小时前
RFC 与设计文档
程序员
jonjia5 小时前
为什么你(或任何人)应该成为一名研发经理?
程序员
jonjia5 小时前
管理技术质量 (Manage Technical Quality)
程序员
jonjia5 小时前
大厂软件工程师职业发展路径
程序员
jonjia5 小时前
关于工程师与影响力
程序员
jonjia5 小时前
多层上下文 (Layers of Context)
程序员