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

news2024/11/18 10:21:42

鸿蒙(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

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

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

Android开发666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【驱动程序】3.5寸SPI液晶屏_ILI9488_stm32f103c8t6_CubeMX_HAL库

【驱动程序】3.5寸SPI液晶屏_ILI9488_stm32f103c8t6_CubeMX_HAL库 主控芯片&#xff1a; stm32f103c8t6 接线&#xff1a; LED-3.3v其他管脚按main.h文件接: #define LCD_CS_Pin GPIO_PIN_1 #define LCD_CS_GPIO_Port GPIOA #define LCD_RS_Pin GPIO_PIN_2…

武汉流星汇聚:全球化与多元化并进,亚马逊展望电商领域无限可能

在全球电商的浩瀚星空中&#xff0c;亚马逊无疑是最为耀眼的一颗星辰。凭借其多年在跨境市场的深耕细作&#xff0c;亚马逊不仅积累了庞大的高活跃用户群&#xff0c;还构建了显著的平台流量优势。根据Similar Web的权威数据&#xff0c;亚马逊的独立访问用户数量已超过26.59亿…

EGO-Swarm 仿真环境搭建

EGO-Swarm仿真环境搭建 参考教程&#xff1a; https://github.com/ZJU-FAST-Lab/ego-planner-swarm EGO-Swarm是一种分散的异步系统解决方案&#xff0c;用于仅使用机载资源在未知的障碍物丰富的场景中进行多机器人自主导航。 1. 查看系统环境 要运行本仿真程序&#xff0c…

评估测量仪器/传感器时的各种精度解析一览

在工业测量中&#xff0c;精度是一个复合概念&#xff0c;涉及到多个方面&#xff0c;通常用来描述测量结果的准确性和可靠性。 在选择测量仪器/传感器时&#xff0c;面对众多的精度名称&#xff0c;你是否苦恼他们具体描述的是什么精度&#xff0c;是否和评估要求有直接关联&…

开放式耳机有什么好处?开放式耳机该怎么选?

​开放式耳机的好处多多呀&#xff01;如今&#xff0c;开放式耳机已经迅速成为耳机市场上的新宠&#xff0c;它们以其独特的佩戴方式和卓越的音质表现&#xff0c;赢得了广大音乐爱好者和运动达人的喜爱。尤其是对于那些热爱听歌和追求运动自由的人们来说&#xff0c;开放式耳…

电脑录屏软件推荐,6款高效录屏神器(2024最全最新)

电脑录屏软件成为了我们工作、学习和娱乐中不可或缺的工具。无论是录制PPT演示、QQ聊天过程&#xff0c;还是进行专业的直播或教学&#xff0c;都需要一款功能强大、操作简便的录屏软件。 那么&#xff0c;本文将为大家进行电脑录屏软件推荐&#xff0c;让您无论在哪种录屏场景…

共享之道——享元模式(Python实现)

共享之道——享元模式&#xff08;Python实现&#xff09; 大家好&#xff0c;今天我们继续来讲结构型设计模式&#xff0c;上一期我们介绍了外观模式&#xff0c;这一期我们来讲享元模式&#xff08;Flyweight Pattern&#xff09;。 享元模式&#xff08;Flyweight Pattern…

超实用 不再担心猫咪掉毛 一文教你养宠家庭空气净化器怎么选

一到夏天&#xff0c;家中的猫咪给你带来的不仅仅是温暖的陪伴&#xff0c;还有那挥之不去的宠物异味。普通空气净化器虽然能够应对一般的空气净化需求&#xff0c;但对于养猫家庭特有的挑战&#xff0c;如宠物毛发、皮屑和异味等&#xff0c;它们往往难以胜任。专业的宠物空气…

【LLM大模型】大模型Prompt Engineering提示词工程

目录&#xff1a; 1、提示工程简介 2、如何写好提示词 2.1 描述清晰2.2 角色扮演2.3 提供示例2.4 复杂任务分解2.5 使用格式符区分语义2.6 情感和物质激励2.7 使用英语2.8 结构化提示词 1、提示工程简介 1.1 什么是Prompt 提示词&#xff1f; 不论是文生图应用&#xff0c;…

STM32-门电路-储存器-寄存器-STM32f1-MCU-GPIO-总线-keil5-点led

1、门电路 门电路组成简单加法器&#xff1a; 二进制对电路的影响&#xff1a; 0和1代表无和有&#xff1b; 以下图例&#xff0c;演示与门&#xff1a;左1右1输出1&#xff1b; 电平标准&#xff1a;使用不同的电压表示数字0和1&#xff1b; 高电平&#xff1a;1&#xff1…

【CSS】文字交融展开

实现如下效果&#xff0c;仅需一个动画几行代码 首先给文本元素添加动画 letter-spacing&#xff1a;初始文本堆在一起&#xff0c;结束展开文本filter&#xff1a;初始模糊&#xff0c;结束清晰 然后给文本的父元素设置对比度&#xff0c;简单理解为亮的更亮暗的更暗。 以…

vue3 项目部署到线上环境,初始进入系统,页面卡顿大概一分钟左右,本地正常无卡顿。localStorage缓存1MB数据导致页面卡顿。

使用vue3进行项目开发&#xff0c;前端框架使用jeecg-boot进行开发&#xff0c;项目初期&#xff0c;打包部署到生产环境&#xff0c;无异常。某天&#xff0c;进行前端项目打包部署到生产环境&#xff0c;突然出现异常情况&#xff0c;部署到线上环境&#xff0c;初始进入系统…

专题十一_字符串

目录 14. 最长公共前缀 解析 题解 5. 最长回文子串 解析 题解 67. 二进制求和 解析 题解 43. 字符串相乘 解析 题解 14. 最长公共前缀 14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 解法一&#xff1a;两两比较&#xff0c;横向比较 clas…

苹果手机录屏没有声音怎么办?2招教你快速解决

今天&#xff0c;录屏功能已成为了我们工作和娱乐中的得力助手。苹果手机凭借其卓越的性能和丰富的功能&#xff0c;自然也在录屏方面有着不俗的表现。苹果手机自带的录屏功能简单直观&#xff0c;能够轻松记录屏幕的精彩瞬间。 然而&#xff0c;有时候苹果手机录屏没有声音怎…

案例:使用Haproxy搭建Web集群

目录 Haproxy Haproxy和LVS的区别 LVS Haproxy 代理和调度的区别 Haproxy调度算法原理 案例 拓扑图 Web服务器配置 Haproxy配置 安装Haproxy Haproxy初步设置 Haproxy配置 配置文件各行说明 监听项配置 启动Haproxy 测试 配置Haproxy日志 Haproxy Haproxy是…

定点数的实现

定点数实现的是float转PEint /// 浮点数有很多问题 多个平台一些运算结果不一致 /// 定点数 运算 &#xff08;把浮点数转为定点数进行运算&#xff0c;保证所有平台结果的一致性&#xff09; //因为要把float转化为整形来操作 //float是一个结构体 所以我们这里也是…

[图解]阿西莫夫·台球杀人事件-《分析模式》漫谈

1 00:00:00,470 --> 00:00:02,510 今天的《分析模式》漫谈 2 00:00:02,760 --> 00:00:06,700 我们来说一个有趣的台球杀人事件 3 00:00:08,640 --> 00:00:09,630 还是第一章 4 00:00:09,920 --> 00:00:12,020 这里有一句&#xff0c;you would 5 00:00:12,030 …

【docker快捷部署系列二】用docker-compose快速配置多个容器,docker部署Springboot+Vue项目和mysql数据库

1、思路 docker部署项目是将项目的不同程序放入不同容器中运行&#xff0c;这样可以方便管理不同程序。我的项目有Springboot、Vue、mysql三部分&#xff0c;Vue用nginx代理&#xff0c;因为nodejs太占空间了。一开始我是用Dockerfile创建镜像再运行容器的&#xff0c;但发现它…

uniapp点击图片预览,关闭预览图片后自动触发onshow生命周期,怎么解决?

第一&#xff0c;页面的数据会实时更新&#xff0c;所以接口请求需要在onshow中&#xff0c;变量figh初始为true&#xff0c;数据列表信息可直接调用获取 当点击查看图片时改变&#xff0c;变量figh为false&#xff0c;此时onshow里面的this.postlist()不触发。 此时&#xff0…