HarmonyOS实战开发-如何实现联系人列表通(仿微信通讯录) ...

嚴華  金牌会员 | 2024-8-26 12:50:23 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 548|帖子 548|积分 1644

先看效果


直入主题

UI布局
Stack帧布局容器+List联系人列表+AlphabetIndexer字母索引器
实现代码

1. 先定义好假数据
• 通讯录列表数据
  1. private dataList: any = [
  2.     {
  3.       title: '',
  4.       contactList: [
  5.         { name: "新的朋友", head: $r("app.media.ic_new_friend") },
  6.         { name: "群聊", head: $r("app.media.ic_group_chat") },
  7.         { name: "标签", head: $r("app.media.ic_tag") },
  8.         { name: "公众号", head: $r("app.media.ic_official_account") }
  9.       ]
  10.     },
  11.     {
  12.       title: 'A',
  13.       contactList: [
  14.         { name: "ArdWard", head: $r("app.media.ic_user_head2") },
  15.         { name: "阿联酋", head: $r("app.media.ic_user_head3") },
  16.         { name: "艾森宝", head: $r("app.media.ic_user_head6") }
  17.       ]
  18.     },
  19. .....忽略中间数据
  20.     {
  21.       title: 'Z',
  22.       contactList: [
  23.         { name: "猪八戒", head: $r("app.media.ic_user_head3") },
  24.         { name: "张宇恒", head: $r("app.media.ic_user_head4") },
  25.         { name: "周大年", head: $r("app.media.ic_user_head5") }
  26.       ]
  27.     }
  28.   ]
复制代码
• 字母索引器列表数据
  1. private letterList: string[] = ['↑', '☆', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#']
复制代码
2. 再举行UI开发

从上文dataList数据布局里可以看出,我做了List嵌套List布局方式以适用通讯录中大组标签(A,B,C…)和它们各自的联系人列表,好在鸿蒙原生组件也支持了这样的列表模式:
  1. List(整体列表)  --> ListItemGroup(A,B,C...组标签)  ---> ListItem(联系人列表)
复制代码
• 那么直接代码实现列表:
  1. build() {
  2.     Stack({ alignContent: Alignment.End }) {
  3.       Column() {
  4.         // 标题栏
  5.         WechatToolbar({ title: "通讯录" })
  6.         // 通讯录列表
  7.         List({ scroller: this.scroller }) {
  8.         // 遍历循环大组标签
  9.           ForEach(this.dataList, (item) => {
  10.             // 大组标签
  11.             ListItemGroup({ header: this.itemHead(item.title) }) {
  12.               // 遍历循环大组内的联系人列表
  13.               ForEach(item.contactList, (contact) => {
  14.                 // 小组联系人列表
  15.                 ListItem() {
  16.                   ListContactItem({ head: contact.head, name: contact.name })
  17.                 }
  18.                 .onClick(()=>{
  19.                   router.pushUrl({ url: 'pages/chat/ChatPage',
  20.                     params: { name: contact.name}
  21.                   })
  22.                 })
  23.               })
  24.             }
  25.             .divider({ strokeWidth: 0.8, color: '#f0f0f0', startMargin: 85, endMargin: 0 }) // 每行之间的分界线
  26.           })
  27.         }
  28.         .width('100%')
  29.         .height(0)
  30.         .layoutWeight(1)
  31.         .backgroundColor(Color.White)
  32.       }
  33.       .width("100%")
  34.       .height("100%")
  35.     ...... 忽略部分代码
  36.     }.width("100%")
  37.     .height("100%")
  38. }
  39.   
  40.   
  41. @Builder itemHead(title: string) {
  42.     Text(title)
  43.       .fontSize(14)
  44.       .visibility("" === title ? Visibility.None : Visibility.Visible)
  45.       .backgroundColor("#EDEDED")
  46.       .height(36)
  47.       .width("100%")
  48.       .padding({ left: 20 })
  49. }
复制代码
• 字母索引器也有原生组件支持,直接看实现代码:
  1. AlphabetIndexer({ arrayValue: this.letterList, selected: 0 })
  2.         .color(Color.Black)
  3.         .font({ size: 14 })
  4.         .selectedFont({ size: 14 })
  5.         .selectedColor(Color.Black)
  6.         .selectedBackgroundColor(Color.Transparent)
  7.         .usingPopup(true)
  8.         .popupColor(Color.White)
  9.         .popupBackground("#57be6a")
  10.         .popupFont({ size: 32, weight: FontWeight.Bolder })
  11.         .itemSize(20)
  12.         .alignStyle(IndexerAlign.Right)
  13.         .margin({ top: 80 })
  14.         .onSelect((index: number) => {
  15.           let letter = this.letterList[index]
  16.           var target: number = 0
  17.           for (const item of this.dataList) {
  18.             if (letter === item.title) {
  19.               this.scroller.scrollToIndex(target)
  20.               prompt.showToast({ message: "" + target })
  21.               break
  22.             }
  23.             target++
  24.           }
  25.     })
复制代码
关键点在于AlphabetIndexer的onSelect事件中使用List的scroller举行滚动锚定,即:点击索引器的任意字母,联系人列表会自动跟着同步滚动。
末了贴下联系人自定义组件代码:
  1. @Preview
  2. @Component
  3. export default struct ListContactItem {
  4.   private head: string | PixelMap | Resource
  5.   private name: string
  6.   build() {
  7.     Row() {
  8.       Image(this.head)
  9.         .width(46)
  10.         .height(46)
  11.         .borderRadius(4)
  12.         .margin({ left: 20, right: 15 })
  13.         .objectFit(ImageFit.Cover)
  14.       Text(this.name)
  15.         .fontSize(19)
  16.         .fontWeight(500)
  17.         .width("100%")
  18.         .layoutWeight(1)
  19.         .maxLines(1)
  20.         .textOverflow({ overflow: TextOverflow.Ellipsis })
  21.         .margin({ right: 30 })
  22.         .fontColor(Color.Black)
  23.     }
  24.     .backgroundColor(Color.White)
  25.     .width("100%")
  26.     .height(60)
  27.   }
  28. }
复制代码
如果各人还没有掌握鸿蒙,现在想要在最短的时间里吃透它,我这边特意整理了《鸿蒙语法ArkTS、TypeScript、ArkUI、讲授视频》以及《鸿蒙生态应用开发白皮书V2.0PDF》《鸿蒙开发学习手册》(共计890页)鸿蒙相干开发资料等…渴望对各人有所帮助:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

鸿蒙语法ArkTS、TypeScript、ArkUI等…视频教程:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3


OpenHarmony APP开发教程步骤:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3


鸿蒙生态应用开发白皮书V2.0PDF:https://docs.qq.com/doc/DZVVkRGRUd3pHSnFG


南北双向高工技能基础:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3


应用开发中高级就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3


全网首发-工业级 南向设备开发就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3


《鸿蒙开发学习手册》:

如何快速入门:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.根本概念
2.构建第一个ArkTS应用
3.……


开发基础知识:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私掩护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……


基于ArkTS 开发:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.背景任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表