鴻蒙(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
如果你想第一時間看我的後期文章,掃碼關注公眾號
安輝程式設計筆記 - 開發技術分享
掃描二維碼加關注