​ 实现效果

通过使用ListItemGroup和AlphabetIndexer两种类型组件,实现带标题分类和右侧导航栏的页面

图片

代码片段

代码架构:


Models中放实体类


ViewModel中存放界面操作相关的类



图片

Models/CarItem

export class CarItem {
/**

  • 汽车名字集合*/

public CarNameList: string[] = [];
/**

  • 所属类型
  • */

public Alphabet: string = '';

constructor(carNameList: string[], alphabet: string) {

this.CarNameList = carNameList;
this.Alphabet = alphabet;

}
}

图片

ViewModels/CarViewModel

import { CarItem } from "../Models/CarItem"

/**

  • 车辆交互类*/

export class CarViewModel {
/**

  • 车辆详细信息集合
  • */

public Items: CarItem[] = [];
/**

  • 头字母集合*/

public Alphabets: Array<string> = [];

constructor() {

//种子数据初始化
this.Init();

}

/**

  • 初始化
    */

public Init(): void {

this.Items.push(new CarItem([
  "奥迪1",
  "奥迪2",
  "奥迪3",
  "奥迪4",
  "奥迪5",
  "奥迪6"
], "A"));

this.Items.push(new CarItem([
  "奔驰1",
  "奔驰2",
  "奔驰3",
  "奔驰4",
  "奔驰5",
  "奔驰6",
  "奔驰7",
], "B"));
this.Items.push(new CarItem([
  "凯美瑞1",
  "凯美瑞2",
  "凯美瑞3",
  "凯美瑞4",
  "凯美瑞5",
  "凯美瑞6",
  "凯美瑞7",
], "K"));
this.Items.push(new CarItem([
  "玛莎拉蒂1",
  "玛莎拉蒂2",
  "玛莎拉蒂3",
  "玛莎拉蒂4",
  "玛莎拉蒂5",
  "玛莎拉蒂6",
  "玛莎拉蒂7",
], "M"));
this.Alphabets.push('A');
this.Alphabets.push('B');
this.Alphabets.push('K');
this.Alphabets.push('M');

}
}

图片

pages/Index

import { CarViewModel } from '../ViewModels/CarViewModel';
import { CarItem } from '../Models/CarItem'

@Entry
@Component
struct Index {
/*
*

  • 界面交互类*/

@State CarVM: CarViewModel = new CarViewModel();
@State SelectIndex: number = 0;
listScroller: Scroller = new Scroller();

/**

  • 头部控件样式
    */

@Builder
GroupHeader(alphabet: string) {

Text(`${alphabet}`)
  .backgroundColor('#fff1f3f5')
  .width('100%')
  .padding(10)

}

build() {

Column() {
  Stack({
    alignContent: Alignment.End
  }) {
    Column() {
      List({ scroller: this.listScroller }) {
        ForEach(this.CarVM.Items, (car: CarItem, index) => {
          ListItemGroup({
            header: this.GroupHeader(`${car.Alphabet}`)
          }) {
            ForEach(car.CarNameList, (name: string, carIndex) => {
              ListItem() {
                Text(`${name}`)
                  .fontSize(16)
                  .width('100%')
                  .padding(10)
              }
            })
          }

        })
      }
      .height("100%")
      .onScrollIndex((selectIndex: number) => {
        //滑动时修改
        this.SelectIndex = selectIndex;
      })
      .sticky(StickyStyle.Header) //设置吸顶效果
    }.height('100%')

    //导航条
    AlphabetIndexer({
      arrayValue: this.CarVM.Alphabets,
      selected: this.SelectIndex
    })
      .onSelect((index) => {
        this.listScroller.scrollToIndex(index);
      })
  }
}
.width("100%")
.height("100%")

}
}

图片


奥尼ᴮᴵᴹᵉʳ
1 声望1 粉丝