前言
最近在日常开发过程中,需要实现城市选择功能,同时支持模糊搜索。看似简单的功能动手实现起来却有很多难点。本篇文章详细记录开发过程中遇到的问题和对应的解决方法,希望能够帮助你,建议点赞收藏!
实现效果
需求分析
- 处理城市列表中的多音字。
- 城市列表要按照字母表的顺序排列
- 将首字母相同的城市分组。
技术实现
- 在日常开发中,城市数据一般由接口获取或从本地 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()
}
})
- 得到城市的字母后,这时就需要对城市数据按字母排序进行处理,借助系统通过collator 类的 compare 方法,对数据的字母进行排序。
let collator = new intl.Collator();
data.sort((firstCity: HotCityBean, secondCity: HotCityBean) = > {
return collator.compare(firstCity.letter, secondCity.letter)
})
- 得到排序后的数据,需要对数据进行分组,将首字母相同的城市放在同一个数组里,这一步有点复杂,需要慢慢看。
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))。 **
- 遍历到最后一条数据时,需要对最后一条数据进行处理,结束后将最后一个字母相同的数据存入城市集合。
if (number == data.length - 1) {
if (!cityType.city.includes(value)) {
cityType.city.push(value)
}
this.cityList.push(cityType)
}
- 经过以上对数据的处理,终于得到了完整的城市数据,接下来就是直接展示列表即可。
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)
- 使用ListItemGroup 用来显示每组城市的首字母,sticky(StickyStyle.Header) 则是开启粘性标题,也就是滑动列表时,每组城市的首字母固定显示在上方。
总结
本文详细讲述了对城市数据的处理,包括对音字,首字母排序以及按首字母对数据进行分组处理,特别是分组处理这块的代码比较复杂,需要亲自动手尝试才能更好的理解,学会的小伙伴赶紧动手试试吧!如果您有更好的处理方式,欢迎评论区留言!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
HarmonyOS
+关注
关注
80文章
2146浏览量
35539
发布评论请先 登录
相关推荐
热点推荐
【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能
) HarmonyOS 的 ** 文档扫描控件(DocumentScanner)** 是 AI Vision Kit 提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能
HarmonyOS入门指南
OpenHarmony三方库中心仓 坚果派 童长老仓库中心 鸿蒙宝典 一本快速学习鸿蒙的电子书 promises-book JavaScript Promise迷你书。 harmony-utils 一款功能丰富且极易
HarmonyOS实战:Tab顶部滑动悬停功能实现
日常开发过程中,遇到这种 Scroll 嵌套 List 列表滑动顶部悬停的场景十分常见,在鸿蒙开发时也正好实现了这个功能,本篇文章将带你一步步实现 Tab 顶部悬停的效果,建议点赞收藏!
HarmonyOS实战:3秒实现一个自定义轮播图
那么简单,需要考虑的细节很多。不过在 HarmonyOS 中实现一个轮播图却是十分的简单,本篇文章教你在最短的时间内快速实现一个自定义的 轮播图,建议点赞收藏!
HarmonyOS实战:快速实现一个上下滚动的广告控件
上要想实现这样的功能并不容易,那么在鸿蒙上怎么实现这样的功能呢?本篇文章教你使用最简单的方式实现一个支持上下滚动的广告控件,建议点赞收藏!
HarmonyOS实战:实现任意拖动的应用悬浮窗口
为了增加应用程序功能的丰富性和便利性,很多应用都会提供一个悬浮窗口实现多页面显示。特别是一些性能检测工具,比如 dokit 。在鸿蒙上怎么实现类似的全局悬浮窗口呢?阅读完本篇文章你将学会在鸿蒙上如何
【HarmonyOS 5】桌面快捷方式功能实现详解
【HarmonyOS 5】桌面快捷方式功能实现详解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 在移动应用开发中,如何让用户
HarmonyOS实战:自定义时间选择器
前言 最近在日常鸿蒙开发过程中,经常会使用一些时间选择器,鸿蒙官方提供的时间选择器满足不了需求,所以自己动手自定义一些经常会使用到的时间选择器,希望能帮到你,建议点赞收藏! 实现效果
HarmonyOS实战:组件化项目搭建
?本文将详细讲解HarmonyOs组件化项目搭建的全过程,带领大家实现一个组件化项目。 项目创建 首先创建一个项目工程,点击开发工具DevEco-Stdio的****File 选项,选择 New 然后点击 Create Proj
HarmonyOS5云服务技术分享--ArkTS开发Node环境
气的方式探索这个功能,结尾还有实用总结和鼓励彩蛋哦~✨
? 一、HarmonyOS云函数开发:核心能力与价值
HarmonyOS的云函数(Serverless)为开发者提供了无服务器架构的便捷
发表于 05-22 17:21
HarmonyOS5云服务技术分享--登录邮件功能整理
高度封装的实现方案。希望本文能帮你快速落地功能,同时注重安全与体验的平衡。如果有更多实战问题,欢迎在评论区留言交流,一起玩转HarmonyOS
发表于 05-22 16:04
PoE交换机如何助力智慧城市基础设施建设?
至关重要。PoE交换机为这些摄像头提供电源,并实现高速数据传输,使城市能够实时监控并快速响应突发事件。PoE交换机灵活的布放方式也确保了城市关键区域的全面覆盖。
环境监测
智
发表于 03-25 10:20
智慧路灯照亮城市之光
在当前科技快速演进的时代背景下,城市公共基础设施亦处于持续的升级与变革进程之中。其中,智慧路灯凭借其显著的功能特性与技术优势,正逐步成为城市现代化建设的关键组成部分。就园区智慧路灯而言
发表于 02-28 20:17
《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发
和优化用户体验。 学、练、考一体化,帮助开发者快速上手HarmonyOS开发,实现职业进阶
《HarmonyOS第一课》不仅内容丰富全面,还融入了大量案例教学与优质动画,带来出色学
发表于 01-02 14:24

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