0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS实战: 城市选择功能的快速实现

尤枫 来源:jf_54996641 作者:jf_54996641 2025-06-24 17:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

最近在日常开发过程中,需要实现城市选择功能,同时支持模糊搜索。看似简单的功能动手实现起来却有很多难点。本篇文章详细记录开发过程中遇到的问题和对应的解决方法,希望能够帮助你,建议点赞收藏!

实现效果

需求分析

  • 处理城市列表中的多音字。
  • 城市列表要按照字母表的顺序排列
  • 将首字母相同的城市分组。

技术实现

  1. 在日常开发中,城市数据一般由接口获取或从本地 json 文件读取,毕竟城市数量和城市编码是固定不变的。不管是哪种方式获取城市数据,都无法保证数据的顺序符合需求,在处理数据顺序之前,首先要处理数据中的多音字,对常见多音字手动添加拼音字母,其余城市直接获取首字母,这里需要借助一个三方库pinyin4js 获取汉字的第一个拼音字母。
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. 得到城市的字母后,这时就需要对城市数据按字母排序进行处理,借助系统通过collator 类的 compare 方法,对数据的字母进行排序。
let collator = new intl.Collator();
        data.sort((firstCity: HotCityBean, secondCity: HotCityBean) = > {
          return collator.compare(firstCity.letter, secondCity.letter)
        })
  1. 得到排序后的数据,需要对数据进行分组,将首字母相同的城市放在同一个数组里,这一步有点复杂,需要慢慢看。
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 作为目标项,然后使用 forEach 遍历数据,如果遍历的对象的首字母和目标项 A 不相等,则先认为首字母 A 的城市遍历结束,直接将相同字母 A 的数据放入集合,否则将相同字母 A 的数据放在一起(cityType.city.push(value))。 **

  1. 遍历到最后一条数据时,需要对最后一条数据进行处理,结束后将最后一个字母相同的数据存入城市集合。
if (number == data.length - 1) {
            if (!cityType.city.includes(value)) {
              cityType.city.push(value)
            }
            this.cityList.push(cityType)
          }
  1. 经过以上对数据的处理,终于得到了完整的城市数据,接下来就是直接展示列表即可。
List({ space: 14, initialIndex: 0, scroller: this.scroller }) {
          ForEach(this.cityList, (bean: HotCityTypeBean, index: number) = > {
            if (index == 0) {
              ListItem() {
                Text() {
                  Span("当前城市: ")
                    .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) 则是开启粘性标题,也就是滑动列表时,每组城市的首字母固定显示在上方。

总结

本文详细讲述了对城市数据的处理,包括对音字,首字母排序以及按首字母对数据进行分组处理,特别是分组处理这块的代码比较复杂,需要亲自动手尝试才能更好的理解,学会的小伙伴赶紧动手试试吧!如果您有更好的处理方式,欢迎评论区留言!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HarmonyOS
    +关注

    关注

    80

    文章

    2146

    浏览量

    35539
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

    HarmonyOS 的 ** 文档扫描控件(DocumentScanner)** 是 AI Vision Kit 提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能
    的头像 发表于 07-11 18:16 860次阅读
    【<b class='flag-5'>HarmonyOS</b> 5】鸿蒙应用<b class='flag-5'>实现</b>发票扫描、文档扫描输出PDF图片或者表格的<b class='flag-5'>功能</b>

    HarmonyOS入门指南

    OpenHarmony三方库中心仓 坚果派 童长老仓库中心 鸿蒙宝典 一本快速学习鸿蒙的电子书 promises-book JavaScript Promise迷你书。 harmony-utils 一款功能丰富且极易
    的头像 发表于 06-27 00:11 557次阅读

    HarmonyOS实战:Tab顶部滑动悬停功能实现

    日常开发过程中,遇到这种 Scroll 嵌套 List 列表滑动顶部悬停的场景十分常见,在鸿蒙开发时也正好实现了这个功能,本篇文章将带你一步步实现 Tab 顶部悬停的效果,建议点赞收藏!
    的头像 发表于 06-24 17:07 283次阅读

    HarmonyOS实战:3秒实现一个自定义轮播图

    那么简单,需要考虑的细节很多。不过在 HarmonyOS实现一个轮播图却是十分的简单,本篇文章教你在最短的时间内快速实现一个自定义的 轮播图,建议点赞收藏!
    的头像 发表于 06-24 17:06 389次阅读

    HarmonyOS实战快速实现一个上下滚动的广告控件

    上要想实现这样的功能并不容易,那么在鸿蒙上怎么实现这样的功能呢?本篇文章教你使用最简单的方式实现一个支持上下滚动的广告控件,建议点赞收藏!
    的头像 发表于 06-24 17:05 369次阅读

    HarmonyOS实战实现任意拖动的应用悬浮窗口

    为了增加应用程序功能的丰富性和便利性,很多应用都会提供一个悬浮窗口实现多页面显示。特别是一些性能检测工具,比如 dokit 。在鸿蒙上怎么实现类似的全局悬浮窗口呢?阅读完本篇文章你将学会在鸿蒙上如何
    的头像 发表于 06-24 17:04 1114次阅读

    HarmonyOS 5】桌面快捷方式功能实现详解

    HarmonyOS 5】桌面快捷方式功能实现详解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 在移动应用开发中,如何让用户
    的头像 发表于 06-21 16:42 1775次阅读
    【<b class='flag-5'>HarmonyOS</b> 5】桌面快捷方式<b class='flag-5'>功能</b><b class='flag-5'>实现</b>详解

    HarmonyOS实战:自定义时间选择

    前言 最近在日常鸿蒙开发过程中,经常会使用一些时间选择器,鸿蒙官方提供的时间选择器满足不了需求,所以自己动手自定义一些经常会使用到的时间选择器,希望能帮到你,建议点赞收藏! 实现效果
    的头像 发表于 06-09 15:51 478次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>实战</b>:自定义时间<b class='flag-5'>选择</b>器

    HarmonyOS实战:组件化项目搭建

    ?本文将详细讲解HarmonyOs组件化项目搭建的全过程,带领大家实现一个组件化项目。 项目创建 首先创建一个项目工程,点击开发工具DevEco-Stdio的****File 选项,选择 New 然后点击 Create Proj
    的头像 发表于 06-09 14:58 504次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>实战</b>:组件化项目搭建

    HarmonyOS5云服务技术分享--ArkTS开发Node环境

    气的方式探索这个功能,结尾还有实用总结和鼓励彩蛋哦~✨ ? 一、HarmonyOS云函数开发:核心能力与价值 HarmonyOS的云函数(Serverless)为开发者提供了​​无服务器架构​​的便捷
    发表于 05-22 17:21

    HarmonyOS5云服务技术分享--登录邮件功能整理

    高度封装的实现方案。希望本文能帮你快速落地功能,同时注重安全与体验的平衡。如果有更多实战问题,欢迎在评论区留言交流,一起玩转HarmonyOS
    发表于 05-22 16:04

    迅为RK3568驱动指南GPIO子系统实战:实现动态切换引脚复用功能

    迅为RK3568驱动指南GPIO子系统实战:实现动态切换引脚复用功能
    的头像 发表于 05-22 14:27 1674次阅读
    迅为RK3568驱动指南GPIO子系统<b class='flag-5'>实战</b>:<b class='flag-5'>实现</b>动态切换引脚复用<b class='flag-5'>功能</b>

    PoE交换机如何助力智慧城市基础设施建设?

    至关重要。PoE交换机为这些摄像头提供电源,并实现高速数据传输,使城市能够实时监控并快速响应突发事件。PoE交换机灵活的布放方式也确保了城市关键区域的全面覆盖。 环境监测 智
    发表于 03-25 10:20

    智慧路灯照亮城市之光

    在当前科技快速演进的时代背景下,城市公共基础设施亦处于持续的升级与变革进程之中。其中,智慧路灯凭借其显著的功能特性与技术优势,正逐步成为城市现代化建设的关键组成部分。就园区智慧路灯而言
    发表于 02-28 20:17

    HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

    和优化用户体验。 学、练、考一体化,帮助开发者快速上手HarmonyOS开发,实现职业进阶 《HarmonyOS第一课》不仅内容丰富全面,还融入了大量案例教学与优质动画,带来出色学
    发表于 01-02 14:24