OpenHarmony开发者论坛

标题: 用OpenHarmony索引条AlphabetIndexer实现内容分组显示(基于OpenHarmony5.0 release) [打印本页]

作者: 深开鸿-孙炼    时间: 2024-11-5 16:55
标题: 用OpenHarmony索引条AlphabetIndexer实现内容分组显示(基于OpenHarmony5.0 release)
[md]# 前言

索引分类分组是应用中常见的功能,OpenHarmony提供了 [索引条(AlphabetIndexer)](https://docs.openharmony.cn/page ... alphabet-indexer.md)组件,可以用来实现内容分类过滤。

# 需求

本文以音乐播放器的歌手列表为例,将歌手名以首字母方式进行分组显示,为用户提供更便捷的查找方法。

![image.png](https://forums-obs.openharmony.c ... h6ttm3h323n0827.png "image.png")

# 实现

定义索引:

```
@State alphabetIndexerHead: string[] =
    ['全', '#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
      'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
      'U', 'V', 'W', 'X', 'Y', 'Z'];
```

添加组件:

```
WaterFlow({ scroller: this.scroller }) {
          LazyForEach(this.aAllSingerDataSource, (item: PlayListData, index) => {
            FlowItem() {
              SingerItem({ item })
            }.backgroundColor(Color.White)
            .borderRadius(12)
          })
        }
AlphabetIndexer({ arrayValue: this.alphabetIndexerHead, selected: 0 })
          .autoCollapse(false)
          .itemSize(20)
          .selectedFont({ size: 20 })
          .font({ size: 16 })
          .onSelect((index: number) => {
            if (!this.isLoading) {
              this.updateDataBySelect(this.alphabetIndexerHead[index]);
            }
          })
          .enabled(!this.isLoading)
          .width('10%')
```

进行数据过滤:

```
updateDataBySelect(indexer: string) {
    if (indexer === this.currentAlphabet) {
      return;
    }
    this.currentAlphabet = indexer;
    this.aAllSingerDataSource.clear();
    let newData: PlayListData[] = []
    if (indexer === '全') {
      newData = this.totalData;
    } else {
      this.totalData.forEach(aSinger => {
        if (aSinger.indexer === indexer) {
          newData.push(aSinger);
        }
      })
    }
    setTimeout(() => {
      animateTo({ duration: 500 }, () => {
        this.aAllSingerDataSource.setData(newData);
        this.count = this.aAllSingerDataSource.totalCount();
      })
    }, 100)
  }
```

效果:

![image.png](https://forums-obs.openharmony.c ... qqk3wa6yq8yv3aa.png "image.png")

# 问题

本文使用的是通过数据变更来展示分组的方式,也曾尝试使用其他方式,但都遇到问题:

1、数据不过滤,通过scrollTo的方式滚动到对应歌手首字母索引的位置,在歌手数量较多(>1000)时,经常触发Appfreeze。

2、通过if语句判断当前list的item是否和过滤的索引相同,来控制渲染实现”显示“和”不显示“

1)***if(indexer === this.currentAlphabet)***{FlowItem(){singerItem()}} ,FlowItem渲染时未遍历全量数据,导致内容显示不出来;

2)FlowItem(){***if(indexer === this.currentAlphabet)***{singerItem()}},控制内部Item渲染,还是显示全部Item,其他Item显示为空白。

# 总结

全量代码工程在集成测试仓的[在线音乐场景测试应用](https://gitee.com/openharmony-si ... o/MusicPlayerOnline)。

通过开发发现,OpenHarmony组件的显示支持、交互方式还不够完善,渲染逻辑不易理解。

用同样的方法可以实现类似联系人的分组查询等,希望本文能给开发者提供一个参考。
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5