当前位置: 首页 > article >正文

Harmony NEXT - AlphabetIndexer实现联系人字母索引

摘要

使用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文档。


http://www.kler.cn/a/377505.html

相关文章:

  • HTTP慢速攻击原理及解决办法
  • Git代码托管(三)可视化工具操作(1)
  • C++笔试题之实现一个定时器
  • Windows换机华为擎云(银河麒麟V10+麒麟9000C CPU)后,使用selenium的程序怎么办(20241030)
  • 如果 MySQL 主库出现了问题,从库该何去何从呢?
  • 使用Mac如何才能提高OCR与翻译的效率
  • 密码学简介
  • Python入门:如何掌控多线程数量
  • 【OD-支持在线评测】智能驾驶(200分)
  • 无人机之自动控制原理篇
  • oracle-函数-NULLIF (expr1, expr2)的妙用
  • Vuestic 数据表格 使用demo
  • HTML前端页面设计静态网站
  • [NOIP2008 普及组] 排座椅
  • 【Redis:原理、架构与应用】
  • 中阳量化交易模型的探索与发展:科技引领金融未来
  • 东方娱乐周刊
  • 注册页面设计(表单基础)
  • 【机器学习】机器学习与成像技术:开启智能视觉的新篇章
  • Zypher Research:服务器抽象叙事,GameFi 赛道的下一个热点?
  • openssl-ecparam 命令手册
  • LeetCode (206单链表反转)
  • React + Vite + TypeScript + React router项目搭建教程
  • 以客户为导向在开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序内容创作中的实践与价值
  • 【缓存与加速技术实践】NoSQL之Redis部署安装与基础命令
  • 【LwIP源码学习4】主线程tcpip_thread