首页 > 其他分享 >鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引

鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引

时间:2024-08-08 12:06:40浏览次数:16  
标签:index 鸿蒙 AlphabetIndexer 字母 NEXT item Harmony 组件

鸿蒙(Harmony) NEXT 9月份就要正式上架了,并且不会再兼容安卓平台,于是我也赶紧给App开发鸿蒙版本,接下来会写一系列的Harmony开发教程。

今天使用AlphabetIndexer实现联系人字母索引,AlphabetIndexer是官方封装好的组件

咱们实现后的效果图:

代码实现

首先在aboutToAppear方法中初始化数据,aboutToAppear方法相当于安卓开发中Activity的onCreate,遍历字符串列表,使用pinyin-pro框架转成拼音,再截取首字母转成大写,最后对数组进行排序,规则是:A-Z-#

initData(){
    const nameList = ["白虎","白天","白痴","常羲","嫦娥",
        "二郎神","伏羲","观世音","精卫","夸父","789范德萨范德萨","女娲","哪吒",
        "盘古","青龙","如来","孙悟空","沙僧","顺风耳","太白金星","太上老君","羲和","玄武",
        "猪八戒","朱雀","祝融","Abbey","Steven","Elizabeth","しんのすけ"];

    for(let i=0;i<nameList.length;i++){
        let pinyinStr=pinyin(nameList[i], { toneType: "none" });//根据姓名获取拼音
        let index=pinyinStr.substring(0,1).toUpperCase();// 获取拼音首字母并转成大写
        if (!/^[A-Z]$/.test(index)) { // 如果不在A-Z中则默认为“#”
            index = "#";
        }
        console.log(nameList[i]+" index:"+index)
        this.list.push(new Contact(index, nameList[i]));
    }

    this.list.sort((a, b) => {
        if (a.index === b.index) {
            return a.name.localeCompare(b.name);
        }
        if (a.index === "#") {
            return 1;
        }
        if (b.index === "#") {
            return -1;
        }
        return a.index.localeCompare(b.index);
    });
}

数据准备好了,接下来如何展示在界面上,ArkTS UI非常简单,不像安卓要写适配器、IOS要写Cell,@Component组件必须要重写build方法,在build方法中实现界面逻辑,首先最外层使用Row容器组件,一行显示,

  • 左边使用List组件加载列表,在循环列表中通过if判断是否显示字母
  • 右边使用AlphabetIndexer组件展示26个字母,实现onSelect方法,用户选中字母会回调这个方法
build() {
    Row() {
        List({ space: 0, initialIndex: 0,scroller:this.scroller}){//加载列表
            ForEach(this.list, (item:Contact,index) => {
                ListItem() {
                    Column(){
                        if (index==0||this.list[index-1].index != item.index){
                            Text(item.index).width('100%').fontColor('#333333').fontSize(14).backgroundColor("#EAEAEA").padding({
                                top:5,bottom:5,left:15
                            })
                        }

                        Text(item.name)
                            .fontSize(30)
                            .padding({
                                top:15,bottom:15,left:15
                            })
                    }.alignItems(HorizontalAlign.Start)
                }
            }, (item:Contact) => util.generateRandomUUID(true))//key随机生成
        }.layoutWeight(1).scrollBar(BarState.Off)
        .height('100%').divider({
            color:'#E5E5E5',
            strokeWidth:0.5
        })

        AlphabetIndexer({ arrayValue: this.value, selected: 0})
            .selectedColor(0xFFFFFF) // 选中项文本颜色
            .popupColor(0xFFFAF0) // 弹出框文本颜色
            .selectedBackgroundColor(0xCCCCCC) // 选中项背景颜色
            .popupBackground(0xD2B48C) // 弹出框背景颜色
            .usingPopup(false) // 是否显示弹出框
            .selectedFont({ size: 16, weight: FontWeight.Bolder }) // 选中项字体样式
            .popupFont({ size: 30, weight: FontWeight.Bolder }) // 弹出框内容的字体样式
            .itemSize(22) // 每一项的尺寸大小
            .alignStyle(IndexerAlign.Left) //弹出框在索引条右侧弹出
            .onSelect((index: number) => {
                console.info(this.value[index] + ' Selected!')
                this.onSelectIndexItem(this.value[index]);
            })
    }
    .width('100%')
    .height('100%')
}

当用户选中某个字母时,循环遍历索引位置,通过scroller滚动到指定位置

onSelectIndexItem(index:string){
    for (let i=0;i<this.list.length;i++){
        console.log("名字:"+this.list[i].name+" index1:"+this.list[i].index+" index2:"+index)
        if (this.list[i].index == index){
            this.scroller.scrollToIndex(i)//滚动到索引位置
            break ;
        }
    }
}

AlphabetIndexer还可以通过usingPopup设置是否使用提示弹窗,大家可以自己去看API文档。如果是安卓开发,实现这个功能代码还是蛮多的,鸿蒙100行代码就能实现这个功能了。

源码下载

源码:

https://github.com/ansen666/AlphabetIndexer

AlphabetIndexer组件API官方文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/ts-container-alphabet-indexer-0000001427744828-V2

pinyin-pro框架:

https://ohpm.openharmony.cn/#/cn/detail/pinyin-pro

如果你想第一时间看我的后期文章,扫码关注公众号

      安辉编程笔记 - 开发技术分享
             扫描二维码加关注

标签:index,鸿蒙,AlphabetIndexer,字母,NEXT,item,Harmony,组件
From: https://www.cnblogs.com/yishaochu/p/18348668

相关文章

  • 鸿蒙HarmonyOS开发:常用布局及实用技巧
    文章目录一、概述二、盒子模型三、线性布局(Column/Row)1、space属性2、justifyContent属性3、alignItems属性四、实用技巧1、Blank组件的使用2、layoutWeight属性的使用一、概述布局是指对页面组件进行排列和定位的过程,其目的是有效地组织和展示页面内容,会涉及到......
  • HarmonyOS应用开发知识地图
    HarmonyOS应用开发旅程HarmonyOS应用开发旅程PS:Xmind原文件可以直接跳转官方具体文档地址,如需要原文件请联系:DYZZ19801.准备与学习学习HarmonyOS的基本概念和架构,搭建好所需的开发工具和环境,了解开发规范和最佳实践了解HarmonyOSHarmonyOS介绍HarmonyOS......
  • HarmonyOS 私仓搭建实战
    HarmonyOS私仓搭建实战背景在Android和iOS开发中很多时候都以以二进制的产物的方式进行依赖和协作,Android基于Mave为仓库,iOS有Pod为仓库,我们可以在官方提供的的平台使用别人开放的库,极大的提高了大家的开发效率。但是有些公司业务相关的库并不想被外部人员使用,上传到外部......
  • HarmonyOS 音视频之音频采集实战
    HarmonyOS音视频之音频采集实战背景应用开发过程中很多场景都有音频采集需求,比如聊天功能的发送语音功能,实时语音转文本功能,实时语音通话,实时视频通话等。在Android和iOS端,系统提供了两种形式:实时音频流采集音频文件录制系统还提供了不同形式的API,比如Android:AudioRec......
  • 【Harmony Next】七夕前学会创建开屏动画拿下女同事的芳心
    【HarmonyNext】七夕前学会创建开屏动画拿下女同事的芳心一个优秀的项目需要一个*格够高的动画来开启,下面教你用三步快速实现鸿蒙应用的开屏动画1.创建窗口使用windowStage.createSubWindow("splash_window")创建窗口对窗口进行管理,实现加载开屏动画在UIAbility的生命周期......
  • HarmonyOS DevEco Studio彻底修改工程名称
    关闭项目将项目文件夹替换为新的名称后重新打开项目将AppScope/app.json5中的bundleName改为新的包名{"app":{"bundleName":"com.example.newname",//改为新的包名"vendor":"example","versionCode":1000000,"......
  • nextjs14 跨域该如何处理
    nextjs官方地址next.config.js和next.config.mjs他有什么区别next.config.js:使用的是CommonJS模块系统。这是Next.js默认的配置文件格式,也是大多数情况下使用的格式。使用require语法导入模块,使用module.exports导出对象。next.config.mjs:使用的是ESMod......
  • HarmonyOS SDK助力美团单车提供便捷流畅扫码新体验
    背景在使用美团单车前,用户需要进行一系列的操作------打开美团App,点击"骑车"进入界面后,再点击"扫码用车",完成扫码后点击"确认开锁",才能最终完成单车开锁。一个简单的动作涉及5个步骤,在远距离或光线过暗等情况下,甚至还需要进行多次扫码才能开锁。策略作为国内头部的科技零售企业......
  • HarmonyOS鸿蒙应用开发之Row & Colum组件的使用
    文章目录Row组件Column组件注意事项其他属性Row和Column组件的通用属性Row组件特有的属性和用法Column组件特有的属性和用法示例代码在HarmonyOS(鸿蒙系统)中,Row和Column组件是ArkTS(ArkTypeScript)语言用于构建用户界面的基础布局容器。它们分别用于实......
  • Win11系统提示找不到PerceptionSimulationExtensions.dll文件
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个PerceptionSimulationExtensions.dll文件(挑......