在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS實(shí)戰(zhàn): 城市選擇功能的快速實(shí)現(xiàn)

尤楓 ? 來源:jf_54996641 ? 作者:jf_54996641 ? 2025-06-24 17:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

最近在日常開發(fā)過程中,需要實(shí)現(xiàn)城市選擇功能,同時(shí)支持模糊搜索??此坪唵蔚墓δ軇?dòng)手實(shí)現(xiàn)起來卻有很多難點(diǎn)。本篇文章詳細(xì)記錄開發(fā)過程中遇到的問題和對應(yīng)的解決方法,希望能夠幫助你,建議點(diǎn)贊收藏!

實(shí)現(xiàn)效果

需求分析

  • 處理城市列表中的多音字。
  • 城市列表要按照字母表的順序排列
  • 將首字母相同的城市分組。

技術(shù)實(shí)現(xiàn)

  1. 在日常開發(fā)中,城市數(shù)據(jù)一般由接口獲取或從本地 json 文件讀取,畢竟城市數(shù)量和城市編碼是固定不變的。不管是哪種方式獲取城市數(shù)據(jù),都無法保證數(shù)據(jù)的順序符合需求,在處理數(shù)據(jù)順序之前,首先要處理數(shù)據(jù)中的多音字,對常見多音字手動(dòng)添加拼音字母,其余城市直接獲取首字母,這里需要借助一個(gè)三方庫pinyin4js 獲取漢字的第一個(gè)拼音字母。
data?.forEach((city) = > {
            if (city.cityName?.includes("長沙")) {
              city.letter = "CHANGSHASHI"
            } else if (city.cityName?.startsWith("重慶")) {
              city.letter = "CHONGQING"
            } else if (city.cityName?.startsWith("廈門")) {
              city.letter = "XIAMENSHI"
            } else {
              city.letter = pinyin4js.convertToPinyinString(city.cityName, '', pinyin4js.FIRST_LETTER).toUpperCase()
            }

          })
  1. 得到城市的字母后,這時(shí)就需要對城市數(shù)據(jù)按字母排序進(jìn)行處理,借助系統(tǒng)通過collator 類的 compare 方法,對數(shù)據(jù)的字母進(jìn)行排序。
let collator = new intl.Collator();
        data.sort((firstCity: HotCityBean, secondCity: HotCityBean) = > {
          return collator.compare(firstCity.letter, secondCity.letter)
        })
  1. 得到排序后的數(shù)據(jù),需要對數(shù)據(jù)進(jìn)行分組,將首字母相同的城市放在同一個(gè)數(shù)組里,這一步有點(diǎn)復(fù)雜,需要慢慢看。
let target = data[0].letter?.charAt(0) ?? ""
        let cityType = new HotCityTypeBean()
        cityType.name = target;
        data.forEach((value, number) = > {
          if (value.letter?.charAt(0) != target) {
            this.cityList.push(cityType)
            target = value.letter?.charAt(0) ?? ""
            cityType = new HotCityTypeBean()
            cityType.name = target
            cityType.city.push(value)
          } else {
            cityType.city.push(value)
          }
      
          .......
        })

**首先得到第一條城市的首字母 A 作為目標(biāo)項(xiàng),然后使用 forEach 遍歷數(shù)據(jù),如果遍歷的對象的首字母和目標(biāo)項(xiàng) A 不相等,則先認(rèn)為首字母 A 的城市遍歷結(jié)束,直接將相同字母 A 的數(shù)據(jù)放入集合,否則將相同字母 A 的數(shù)據(jù)放在一起(cityType.city.push(value))。 **

  1. 遍歷到最后一條數(shù)據(jù)時(shí),需要對最后一條數(shù)據(jù)進(jìn)行處理,結(jié)束后將最后一個(gè)字母相同的數(shù)據(jù)存入城市集合。
if (number == data.length - 1) {
            if (!cityType.city.includes(value)) {
              cityType.city.push(value)
            }
            this.cityList.push(cityType)
          }
  1. 經(jīng)過以上對數(shù)據(jù)的處理,終于得到了完整的城市數(shù)據(jù),接下來就是直接展示列表即可。
List({ space: 14, initialIndex: 0, scroller: this.scroller }) {
          ForEach(this.cityList, (bean: HotCityTypeBean, index: number) = > {
            if (index == 0) {
              ListItem() {
                Text() {
                  Span("當(dāng)前城市: ")
                    .fontSize($r("app.float.sp_t5"))
                    .fontColor($r("app.color.color_S5"))
                  Span(this.cityName)
                    .fontSize($r("app.float.sp_t5"))
                    .fontColor($r("app.color.color_S7"))
                }
              }.margin({ top: $r("app.float.vp_10") })

            }
            ListItemGroup({ header: this.headView(bean.name) }) {
              ForEach(bean.city, (item: HotCityBean, childIndex: number) = > {
                ListItem() {
                  Column() {
                    Text(`${item.cityName}`)
                      .height(44)
                      .fontSize($r('app.float.sp_t4'))
                      .width(FULL_WIDTH)
                      .onClick(() = > {
                       
                      })
                    if (childIndex == bean.city.length - 1) {
                      Divider()
                        .color($r('app.color.color_S3'))
                        .height(0.5)
                        .vertical(false)
                    }
                  }.alignItems(HorizontalAlign.Start)
                }
              }, (item: HotCityBean, childIndex: number) = > `${childIndex}${new Date()}`)
            }
          }, (bean: HotCityTypeBean, index: number) = > `${index}${new Date()}`)
        } .sticky(StickyStyle.Header)
  1. 使用ListItemGroup 用來顯示每組城市的首字母,sticky(StickyStyle.Header) 則是開啟粘性標(biāo)題,也就是滑動(dòng)列表時(shí),每組城市的首字母固定顯示在上方。

總結(jié)

本文詳細(xì)講述了對城市數(shù)據(jù)的處理,包括對音字,首字母排序以及按首字母對數(shù)據(jù)進(jìn)行分組處理,特別是分組處理這塊的代碼比較復(fù)雜,需要親自動(dòng)手嘗試才能更好的理解,學(xué)會(huì)的小伙伴趕緊動(dòng)手試試吧!如果您有更好的處理方式,歡迎評論區(qū)留言!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2145

    瀏覽量

    32489
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    HarmonyOS實(shí)戰(zhàn):Tab頂部滑動(dòng)懸停功能實(shí)現(xiàn)

    日常開發(fā)過程中,遇到這種 Scroll 嵌套 List 列表滑動(dòng)頂部懸停的場景十分常見,在鴻蒙開發(fā)時(shí)也正好實(shí)現(xiàn)了這個(gè)功能,本篇文章將帶你一步步實(shí)現(xiàn) Tab 頂部懸停的效果,建議點(diǎn)贊收藏!
    的頭像 發(fā)表于 06-24 17:07 ?79次閱讀

    HarmonyOS實(shí)戰(zhàn):3秒實(shí)現(xiàn)一個(gè)自定義輪播圖

    那么簡單,需要考慮的細(xì)節(jié)很多。不過在 HarmonyOS實(shí)現(xiàn)一個(gè)輪播圖卻是十分的簡單,本篇文章教你在最短的時(shí)間內(nèi)快速實(shí)現(xiàn)一個(gè)自定義的 輪播圖,建議點(diǎn)贊收藏!
    的頭像 發(fā)表于 06-24 17:06 ?86次閱讀

    HarmonyOS實(shí)戰(zhàn)快速實(shí)現(xiàn)一個(gè)上下滾動(dòng)的廣告控件

    上要想實(shí)現(xiàn)這樣的功能并不容易,那么在鴻蒙上怎么實(shí)現(xiàn)這樣的功能呢?本篇文章教你使用最簡單的方式實(shí)現(xiàn)一個(gè)支持上下滾動(dòng)的廣告控件,建議點(diǎn)贊收藏!
    的頭像 發(fā)表于 06-24 17:05 ?83次閱讀

    HarmonyOS實(shí)戰(zhàn)實(shí)現(xiàn)任意拖動(dòng)的應(yīng)用懸浮窗口

    為了增加應(yīng)用程序功能的豐富性和便利性,很多應(yīng)用都會(huì)提供一個(gè)懸浮窗口實(shí)現(xiàn)多頁面顯示。特別是一些性能檢測工具,比如 dokit 。在鴻蒙上怎么實(shí)現(xiàn)類似的全局懸浮窗口呢?閱讀完本篇文章你將學(xué)會(huì)在鴻蒙上如何
    的頭像 發(fā)表于 06-24 17:04 ?80次閱讀

    HarmonyOS 5】桌面快捷方式功能實(shí)現(xiàn)詳解

    HarmonyOS 5】桌面快捷方式功能實(shí)現(xiàn)詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財(cái)# 一、前言 在移動(dòng)應(yīng)用開發(fā)中,如何讓用戶
    的頭像 發(fā)表于 06-21 16:42 ?159次閱讀
    【<b class='flag-5'>HarmonyOS</b> 5】桌面快捷方式<b class='flag-5'>功能</b><b class='flag-5'>實(shí)現(xiàn)</b>詳解

    HarmonyOS實(shí)戰(zhàn):自定義時(shí)間選擇

    前言 最近在日常鴻蒙開發(fā)過程中,經(jīng)常會(huì)使用一些時(shí)間選擇器,鴻蒙官方提供的時(shí)間選擇器滿足不了需求,所以自己動(dòng)手自定義一些經(jīng)常會(huì)使用到的時(shí)間選擇器,希望能幫到你,建議點(diǎn)贊收藏! 實(shí)現(xiàn)效果
    的頭像 發(fā)表于 06-09 15:51 ?136次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>實(shí)戰(zhàn)</b>:自定義時(shí)間<b class='flag-5'>選擇</b>器

    HarmonyOS實(shí)戰(zhàn):組件化項(xiàng)目搭建

    ?本文將詳細(xì)講解HarmonyOs組件化項(xiàng)目搭建的全過程,帶領(lǐng)大家實(shí)現(xiàn)一個(gè)組件化項(xiàng)目。 項(xiàng)目創(chuàng)建 首先創(chuàng)建一個(gè)項(xiàng)目工程,點(diǎn)擊開發(fā)工具DevEco-Stdio的****File 選項(xiàng),選擇 New 然后點(diǎn)擊 Create Proj
    的頭像 發(fā)表于 06-09 14:58 ?169次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>實(shí)戰(zhàn)</b>:組件化項(xiàng)目搭建

    快速入門——LuatOS:sys庫多任務(wù)管理實(shí)戰(zhàn)攻略!

    在嵌入式開發(fā)中,多任務(wù)管理是提升系統(tǒng)效率的關(guān)鍵。本教程專為快速入門設(shè)計(jì),聚焦LuatOS的sys庫,通過實(shí)戰(zhàn)案例帶你快速掌握多任務(wù)創(chuàng)建、調(diào)度與同步技巧。無論你是零基礎(chǔ)新手還是希望快速
    的頭像 發(fā)表于 05-29 14:36 ?166次閱讀
    <b class='flag-5'>快速</b>入門——LuatOS:sys庫多任務(wù)管理<b class='flag-5'>實(shí)戰(zhàn)</b>攻略!

    HarmonyOS5云服務(wù)技術(shù)分享--ArkTS開發(fā)Node環(huán)境

    氣的方式探索這個(gè)功能,結(jié)尾還有實(shí)用總結(jié)和鼓勵(lì)彩蛋哦~? ? 一、HarmonyOS云函數(shù)開發(fā):核心能力與價(jià)值 HarmonyOS的云函數(shù)(Serverless)為開發(fā)者提供了??無服務(wù)器架構(gòu)??的便捷
    發(fā)表于 05-22 17:21

    HarmonyOS5云服務(wù)技術(shù)分享--登錄郵件功能整理

    高度封裝的實(shí)現(xiàn)方案。希望本文能幫你快速落地功能,同時(shí)注重安全與體驗(yàn)的平衡。如果有更多實(shí)戰(zhàn)問題,歡迎在評論區(qū)留言交流,一起玩轉(zhuǎn)HarmonyOS
    發(fā)表于 05-22 16:04

    迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng)實(shí)戰(zhàn):實(shí)現(xiàn)動(dòng)態(tài)切換引腳復(fù)用功能

    迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng)實(shí)戰(zhàn):實(shí)現(xiàn)動(dòng)態(tài)切換引腳復(fù)用功能
    的頭像 發(fā)表于 05-22 14:27 ?691次閱讀
    迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng)<b class='flag-5'>實(shí)戰(zhàn)</b>:<b class='flag-5'>實(shí)現(xiàn)</b>動(dòng)態(tài)切換引腳復(fù)用<b class='flag-5'>功能</b>

    PoE交換機(jī)如何助力智慧城市基礎(chǔ)設(shè)施建設(shè)?

    至關(guān)重要。PoE交換機(jī)為這些攝像頭提供電源,并實(shí)現(xiàn)高速數(shù)據(jù)傳輸,使城市能夠?qū)崟r(shí)監(jiān)控并快速響應(yīng)突發(fā)事件。PoE交換機(jī)靈活的布放方式也確保了城市關(guān)鍵區(qū)域的全面覆蓋。 環(huán)境監(jiān)測 智
    發(fā)表于 03-25 10:20

    智慧路燈照亮城市之光

    在當(dāng)前科技快速演進(jìn)的時(shí)代背景下,城市公共基礎(chǔ)設(shè)施亦處于持續(xù)的升級與變革進(jìn)程之中。其中,智慧路燈憑借其顯著的功能特性與技術(shù)優(yōu)勢,正逐步成為城市現(xiàn)代化建設(shè)的關(guān)鍵組成部分。就園區(qū)智慧路燈而言
    發(fā)表于 02-28 20:17

    HarmonyOS第一課》煥新升級,賦能開發(fā)者快速掌握鴻蒙應(yīng)用開發(fā)

    和優(yōu)化用戶體驗(yàn)。 學(xué)、練、考一體化,幫助開發(fā)者快速上手HarmonyOS開發(fā),實(shí)現(xiàn)職業(yè)進(jìn)階 《HarmonyOS第一課》不僅內(nèi)容豐富全面,還融入了大量案例教學(xué)與優(yōu)質(zhì)動(dòng)畫,帶來出色學(xué)
    發(fā)表于 01-02 14:24

    慶科信息獲HarmonyOS高級應(yīng)用開發(fā)能力認(rèn)證!助力品牌快速打造鴻蒙原生應(yīng)用

    近日,上海慶科信息技術(shù)有限公司榮獲HarmonyOS應(yīng)用開發(fā)者高級認(rèn)證,公司在華為鴻蒙生態(tài)的開發(fā)能力得到進(jìn)一步拓展,能夠幫助客戶快速開發(fā)基于HarmonyOS Next的鴻蒙原生應(yīng)用,助力廠商全面擁抱鴻蒙生態(tài)。
    的頭像 發(fā)表于 07-17 13:24 ?935次閱讀
    慶科信息獲<b class='flag-5'>HarmonyOS</b>高級應(yīng)用開發(fā)能力認(rèn)證!助力品牌<b class='flag-5'>快速</b>打造鴻蒙原生應(yīng)用
    主站蜘蛛池模板: 俺去俺来也www色官网免费的 | 午夜影院三级 | 在线播放免费 | 色猫av | 超级香蕉97视频在线观看一区 | 成人一级毛片 | 日干夜干天天干 | 亚洲国产成人精品不卡青青草原 | 高清影院在线欧美人色 | 亚洲日本欧美日韩高观看 | 边做边爱在线观看视频免费 | 男啪女视频免费观看网站 | 天天舔天天操天天干 | 国产精品伦子一区二区三区 | 国产成人毛片视频不卡在线 | 免费爱爱网 | 综合99| 精品色| 在线另类 | 72种姿势欧美久久久久大黄蕉 | 国产美女视频爽爽爽 | 免费一级大毛片a一观看不卡 | 日本视频色 | 黑人性xxxⅹxxbbbbb | 国模视频在线 | 一色屋成人免费精品网 | 被男同桌摸内裤好爽视频 | 天天综合色一区二区三区 | 免费人成在线观看视频播放 | 男女在线观看视频 | 亚综合| 久久国内精品视频 | 欧美xxxx性高清 | 在线免费观看色视频 | 国漫在线观看 | 夜夜操天天干 | 午夜福利123| 中日韩黄色大片 | 亚洲欧美视频在线观看 | 久久都是精品 | 特级黄一级播放 |