前言
最近在日常开发过程中,需要实现城市选择功能,同时支持模糊搜索。看似简单的功能动手实现起来却有很多难点。本篇文章详细记录开发过程中遇到的问题和对应的解决方法,希望能够帮助你,建议点赞收藏!
实现效果
需求分析
- 处理城市列表中的多音字。
- 城市列表要按照字母表的顺序排列
- 将首字母相同的城市分组。
技术实现
- 在日常开发中,城市数据一般由接口获取或从本地 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文章
2157浏览量
36283
发布评论请先 登录
相关推荐
热点推荐
AirCloud平台+excloud扩展库:核心功能实战应用!
AirCloud平台的配置灵活性与excloud扩展库的功能扩展性,通过实战应用得以充分体现。下面整理核心功能实战示例集,覆盖常见业务需求场景:如通过平台配置
物联网短信实战:SMS库收发功能速成来啦!
在物联网开发中,短信收发是常见需求。本文带来一场技术实战,借助SMS库,10分钟内即可实现物联网短信的收发。通过简单易懂的教程,让你快速掌握这项功能,为物联网项目赋能。 SMS核心
【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
快速入门——LuatOS:sys库多任务管理实战攻略!
在嵌入式开发中,多任务管理是提升系统效率的关键。本教程专为快速入门设计,聚焦LuatOS的sys库,通过实战案例带你快速掌握多任务创建、调度与同步技巧。无论你是零基础新手还是希望快速提
HarmonyOS5云服务技术分享--ArkTS开发Node环境
气的方式探索这个功能,结尾还有实用总结和鼓励彩蛋哦~✨
? 一、HarmonyOS云函数开发:核心能力与价值
HarmonyOS的云函数(Serverless)为开发者提供了无服务器架构的便捷
发表于 05-22 17:21
HarmonyOS5云服务技术分享--登录邮件功能整理
高度封装的实现方案。希望本文能帮你快速落地功能,同时注重安全与体验的平衡。如果有更多实战问题,欢迎在评论区留言交流,一起玩转HarmonyOS
发表于 05-22 16:04
HarmonyOS实战: 城市选择功能的快速实现
评论