鸿蒙开发:案例集合List:多级列表(商品分类)

🎯 案例集合List:多级列表(商品分类)

🌍 案例集合List

🚪 最近开启了学员班级点我欢迎加入

🏷️ 效果图

📖 参考

🧩 拆解

  • 多级列表滚动,头部组粘性(后续会增加高性能的方式)
javascript 复制代码
import { HashMap } from "@kit.ArkTS";

/**
 * 模拟数据
 */
const mockData: string[] = ['购物', '体育', '服装', '军事']
/**
 * 多级列表数据
 */
const hasMap: HashMap<string, string[]> = new HashMap()
for (let i = 0; i < mockData.length; i++) {
  hasMap.set(`${mockData[i]}_mock`, ['吃饭', '睡觉', '打豆豆'])
}

@Component
export struct MultiLevelList {
  /**
   * 当前选中的列表项下标
   */
  @State curSelectIdx: number = 0
  /**
   * 列表构造器
   */
  private listScroller: ListScroller = new ListScroller()

  /**
   * 列表组头部
   * @param headerName
   */
  @Builder
  groupHeaderBuilder(headerName: string) {
    Row() {
      Text(headerName)
        .fontSize(18)
        .fontWeight(500)
    }
    .width('100%')
    .height(56)
    .padding({ left: 8 })
    .backgroundColor('#F1F3F5')
  }

  /**
   * 当前滑动或者点击的列表组项
   * @param index
   * @param operationType 操作类型
   */
  curSelectItemChange(index: number, operationType: string) {
    this.curSelectIdx = index

    // 只有为左边点击label的时候才需滚动右侧列表
    if (operationType === 'click') {
      this.listScroller.scrollToIndex(index)
    }
  }

  /**
   * 最后一个列表组的下的内边距 (主要处理列表组滑动到底部)
   * @param idx
   * @returns
   */
  private ednListItemGroupBottomPadding(idx: number) {
    // 单个列表组的高度 (购物为例)
    const itemGroupHeight = hasMap.get('购物_mock').length * 100
    // 表头高度 * 2
    const groupHeaderHeight = 56 * 2
    return mockData.length - 1 === idx ? itemGroupHeight + groupHeaderHeight : 0
  }

  build() {
    Row() {
      Column() {
        ForEach(mockData, (item: number, idx: number) => {
          Text(item.toString())
            .width('100%')
            .height(56)
            .fontSize(this.curSelectIdx === idx ? 20 : 16)
            .textAlign(TextAlign.Center)
            .fontColor(this.curSelectIdx === idx ? Color.Orange : Color.Black)
            .opacity(this.curSelectIdx === idx ? 1 : 0.6)
            .fontWeight(this.curSelectIdx === idx ? FontWeight.Bold : FontWeight.Normal)
            .onClick(() => {
              this.curSelectItemChange(idx, 'click')
            })
        }, (item: number) => item.toString())
      }
      .width(130)
      .height('100%')
      .backgroundColor('#4dfdddcb')

      List({ scroller: this.listScroller }) {
        ForEach(mockData, (item: string, idx: number) => {
          ListItemGroup({ header: this.groupHeaderBuilder(item), space: 5 }) {
            ForEach(hasMap.get(`${item}_mock`), (item: string) => {
              ListItem() {
                Text(item)
                  .height(100)
                  .width('100%')
                  .fontSize(20)
                  .borderRadius(10)
                  .textAlign(TextAlign.Center)
              }
            }, (item: number) => item.toString())
          }
          .padding({ bottom: this.ednListItemGroupBottomPadding(idx) })
        }, (item: number) => item.toString())
      }
      .height('100%')
      .layoutWeight(1)
      .scrollBar(BarState.Off) // 关闭滚动条
      .sticky(StickyStyle.Header) // 头部粘性
      .edgeEffect(EdgeEffect.None) // 关闭滚动动效
      .padding({ left: 8, right: 12 })
      .onScrollIndex((idx: number) => {
        this.curSelectItemChange(idx, 'swipe')
      })
    }
    .width('100%')
    .height('100%')
  }
}

🌸🌼🌺

相关推荐
国服第二切图仔2 小时前
Electron for 鸿蒙PC项目开发之模态框组件
javascript·electron·harmonyos
lichong9512 小时前
harmonyos 大屏设备怎么弹出 u 盘
前端·macos·华为·typescript·android studio·harmonyos·大前端
kirk_wang3 小时前
Flutter图片库CachedNetworkImage鸿蒙适配:从原理到实践
flutter·移动开发·跨平台·arkts·鸿蒙
Rene_ZHK3 小时前
Day4 AtomGit口袋工具开发1.0
harmonyos
晚霞的不甘3 小时前
Flutter 与开源鸿蒙(OpenHarmony)性能调优与生产部署实战:从启动加速到线上监控的全链路优化
flutter·开源·harmonyos
diygwcom3 小时前
UniApp 鸿蒙NEXT蓝牙连接及数据写入
华为·uni-app·harmonyos
国服第二切图仔3 小时前
Electron for 鸿蒙PC项目实战案例之水果消消乐
javascript·electron·harmonyos·鸿蒙pc
xiaocao_10233 小时前
记录在鸿蒙手机的备忘录内容被误删怎么找回?
华为·harmonyos
柒儿吖3 小时前
Electron for 鸿蒙PC - 番茄工作法计时器适配问题排查与解决方案
javascript·electron·harmonyos