鴻蒙(Harmony) NEXT - AlphabetIndexer實現聯絡人字母索引

安辉發表於2024-08-08

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

如果你想第一時間看我的後期文章,掃碼關注公眾號

      安輝程式設計筆記 - 開發技術分享
             掃描二維碼加關注

相關文章