2024年HarmonyOS鸿蒙最新【HarmonyOS实战开发】ArkTS仿写微信-通讯录_arkts 通讯录(2),ios大厂面试题

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

private listScroller: Scroller = new Scroller();

List({ scroller: this.listScroller }){
  ListItemGroup() {
    ListItem(){
      ContactsRow({imagePath:'/images/contact_0.png',titleString:'新的朋友'})
    }
  
    ListItem(){
      ContactsRow({imagePath:'/images/contact_1.png',titleString:'仅聊天的朋友'})
    }
  
    ListItem(){
      ContactsRow({imagePath:'/images/contact_2.png',titleString:'群聊'})
    }
  
    ListItem(){
      ContactsRow({imagePath:'/images/contact_3.png',titleString:'标签'})
    }
  
    ListItem(){
      ContactsRow({imagePath:'/images/contact_4.png',titleString:'公众号'})
    }
  }
  .padding({left:15,right:15})
  .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })
  
  ListItemGroup() {
    ListItem(){
      Column() {
        Column() {
          Text('我的企业及企业联系人').fontSize(14).fontColor(Color.Gray)
        }
        .backgroundColor('#E6E6E6')
        .width('100%')
        .height(36)
        .padding({
          left: 15
        })
        .justifyContent(FlexAlign.Center)
        .alignItems(HorizontalAlign.Start)
  
        ContactsRow({
          imagePath:'/images/contact_5.png',
          titleString:'企业微信联系人'
        }).padding({left:15,right:15})
      }
    }
    ListItem(){
      ContactsRow({
        imagePath:'/images/contact_5.png',
        titleString:'企业微信通知',
        count: 36
      }).padding({left:15,right:15})
    }
  }
  .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })
}
AlphabetIndexer侧栏索引联动

图片

1、通过onSelect获取索引值,然后通过scrollToIndex(index)滚动到对应位置;

2、list中通过onScrollIndex,判断索引值;

onScrollIndex((firstIndex: number) => {
  this.selectedIndex = firstIndex
  console.log('**************', firstIndex);
  if(firstIndex > 2) {
    this.selectedIndex = this.letters.findIndex(i => i === this.fList[firstIndex - 3]['letter'])
  }
  // 根据列表滚动到的索引值,重新计算对应联系人索引栏的位置this.selectedIndex
})

3、配置索引侧栏

@State letters: string[] = ['→', '※', 'A','B','C','D','E','F','H','I','G','K','L','M','N', 'O','P','Q','R','S','T','U','V','W','X','Y','Z','#']
private listScroller: Scroller = new Scroller();
@State selectedIndex: number = 0;
  
build() {
  AlphabetIndexer({ arrayValue: this.letters, selected: 0 })
    .color(Color.Black)
    .selectedColor(0xFFFFFF) // 选中项文本颜色
    .popupColor(0xFFFAF0) // 弹出框文本颜色
    .selectedBackgroundColor('rgb(1,196,194)') // 选中项背景颜色
    .popupBackground(0xD2B48C) // 弹出框背景颜色
    .usingPopup(true) // 是否显示弹出框
    .selectedFont({ size: 13, weight: FontWeight.Bolder }) // 选中项字体样式
    .popupFont({ size: 30, weight: FontWeight.Bolder }) // 弹出框内容的字体样式
    .itemSize(20) // 每一项的尺寸大小
    .alignStyle(IndexerAlign.Left) // 弹出框在索引条左侧弹出
    .onSelect((index: number) => {
      console.info(this.letters[index] + ' Selected!', index)
      this.listScroller.scrollToIndex(index)
    })
    .onPopupSelect((index: number) => {
      console.info('onPopupSelected:' + index)
    })
    .selected(this.selectedIndex)
}
List实现swipeAction侧滑删除

通过ListItem上面的swipeAction属性进行配置

@Builder itemEnd(index: number) {
  // 侧滑后尾端出现的组件
  Button({ type: ButtonType.Circle }) {
    Image($r('app.media.ic_public_delete_filled'))
      .width(20)
      .height(20)
      .fillColor(Color.Red)
  }
  .backgroundColor(Color.Transparent)
  .padding(12)
  .margin({
    right: 18
  })
  .onClick(() => {
    // 操作数据/请求后台删除数据;
  })
}

build() {
  List() {
    ForEach(this.list, (item, index) => {
      ListItem(){
        ContactsRow({imagePath: $rawfile('start1.jpg'),titleString:'老婆'})
          .padding({left:15,right:15})
      }
      .swipeAction({ end: this.itemEnd.bind(this, index) })
    })
  }
}
图标实现Badge消息提示

图片

通过Badge组件实现,或者通过Stack配合postion定位自定义实现

@Component
 struct ContactsRow {
  imagePath:string | Resource
  titleString:string
  count?: number

  build(){
    Flex({direction:FlexDirection.Row,alignItems:ItemAlign.Center}){
      Badge({
        count: this.count,
        position: BadgePosition.RightTop,
        style: { badgeSize: 16, badgeColor: '#FA2A2D' }
      }) {
        Image(this.imagePath)
          .width(41)
          .height(41)
          .borderRadius(3)
      }
      Text(this.titleString)
        .fontSize(18)
        .margin({left:10})
    }
    .height(55)
  }
}
通讯录完整代码

import router from '@ohos.router'

@Entry
@Component
export default  struct Contacts {
  @State message: string = 'Hello World'

  @State fList: object[] = [
    {'letter':"A",'data':[
      {'name':'A-老张','avtar': $rawfile('icon4.jpg')},
      {'name':'A-老张1','avtar':$rawfile('icon4.jpg')},
      {'name':'A-老张2','avtar': $rawfile('icon4.jpg')},
      {'name':'A-老张3','avtar': $rawfile('icon4.jpg')},
      {'name':'A-老张4','avtar': $rawfile('icon4.jpg')},
      {'name':'A-老张5','avtar': $rawfile('icon4.jpg')},
    ]},
    {'letter':"L",'data':[
      {'name':'老张','avtar':'/images/icon2.png'},
      {'name':'老张1','avtar':'/images/icon2.png'},
      {'name':'老张2','avtar':'/images/icon2.png'},
      {'name':'老张3','avtar':'/images/icon2.png'},
      {'name':'老张4','avtar':'/images/icon2.png'},
      {'name':'老张5','avtar':'/images/icon2.png'},
    ]},
    {'letter':"W",'data':[
      {'name':'王富贵','avtar':'/images/icon3.png'},
      {'name':'王富贵1','avtar':'/images/icon3.png'},
      {'name':'王富贵2','avtar':'/images/icon3.png'},
      {'name':'王富贵3','avtar':'/images/icon3.png'},
      {'name':'王富贵4','avtar':'/images/icon3.png'},
      {'name':'王富贵5','avtar':'/images/icon3.png'},
      {'name':'王富贵6','avtar':'/images/icon3.png'},
    ]},
    {'letter':"Z",'data':[
      {'name':'猪头','avtar':'/images/icon1.png'},
      {'name':'猪头1','avtar':'/images/icon1.png'},
      {'name':'猪头2','avtar':'/images/icon1.png'},
      {'name':'猪头3','avtar':'/images/icon1.png'},
      {'name':'猪头4','avtar':'/images/icon1.png'},
      {'name':'猪头5','avtar':'/images/icon1.png'},
      {'name':'猪头6','avtar':'/images/icon1.png'},
      {'name':'猪头7','avtar':'/images/icon1.png'},
      {'name':'猪头8','avtar':'/images/icon1.png'},
      {'name':'猪头9','avtar':'/images/icon1.png'},
      {'name':'猪头10','avtar':'/images/icon1.png'},
      {'name':'猪头11','avtar':'/images/icon1.png'},
      {'name':'猪头12','avtar':'/images/icon1.png'},
    ]},
  ]

  @State letters: string[] = ['→', '※', 'A','B','C','D','E','F','H','I','G','K','L','M','N', 'O','P','Q','R','S','T','U','V','W','X','Y','Z','#']

  @Builder NavigationMenus() { // CustomBuilder类型的菜单栏
    Row() {
      Image('/images/contact_add.png')
        .size({ width: 24, height: 24 })
        .margin({ left: 5, top: 16 })
        .onClick(()=>{

        })
    }.justifyContent(FlexAlign.End)
  }

  @Builder NavigationTitle() {
    Row(){
      Text("通讯录")
        .width('100')
    }
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }

  @Builder itemHead(text:string) {
    Text(text)
      .fontSize(14)
      .backgroundColor('#E6E6E6')
      .width("120%")
      .padding({
        left: 15,
        top: 8,
        bottom: 8
      })
      .fontColor(Color.Gray)
      .margin({
        left: -15,
      })
  }

  private listScroller: Scroller = new Scroller();
  @State selectedIndex: number = 0;

  @Builder itemEnd(index: number) {
    // 侧滑后尾端出现的组件
    Button({ type: ButtonType.Circle }) {
      Image($r('app.media.ic_public_delete_filled'))
        .width(20)
        .height(20)
        .fillColor(Color.Red)
    }
    .backgroundColor(Color.Transparent)
    .padding(12)
    .margin({
      right: 18
    })
    .onClick(() => {
      // 操作数据/请求后台删除数据;
    })
  }

  build() {
    Column() {
      Navigation(){
        Stack({ alignContent: Alignment.End }){
          Column(){
            List({ scroller: this.listScroller }){
              ListItemGroup() {
                ListItem(){
                  ContactsRow({imagePath:'/images/contact_0.png',titleString:'新的朋友'})
                }

                ListItem(){
                  ContactsRow({imagePath:'/images/contact_1.png',titleString:'仅聊天的朋友'})
                }

                ListItem(){
                  ContactsRow({imagePath:'/images/contact_2.png',titleString:'群聊'})
                }

                ListItem(){
                  ContactsRow({imagePath:'/images/contact_3.png',titleString:'标签'})
                }

                ListItem(){
                  ContactsRow({imagePath:'/images/contact_4.png',titleString:'公众号'})
                }
              }
              .padding({left:15,right:15})
              .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })

              ListItemGroup() {
                ListItem(){
                  Column() {
                    Column() {
                      Text('我的企业及企业联系人').fontSize(14).fontColor(Color.Gray)
                    }
                    .backgroundColor('#E6E6E6')
                    .width('100%')
                    .height(36)
                    .padding({
                      left: 15
                    })
                    .justifyContent(FlexAlign.Center)
                    .alignItems(HorizontalAlign.Start)

                    ContactsRow({
                      imagePath:'/images/contact_5.png',
                      titleString:'企业微信联系人'
                    }).padding({left:15,right:15})
                  }
                }
                ListItem(){
                  ContactsRow({
                    imagePath:'/images/contact_5.png',
                    titleString:'企业微信通知',
                    count: 36
                  }).padding({left:15,right:15})
                }
              }
              .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })

              ListItemGroup() {
                ListItem(){
                  Column() {
                    Column() {
                      Text('星标朋友').fontSize(14).fontColor(Color.Gray)
                    }
                    .backgroundColor('#E6E6E6')
                    .width('100%')
                    .height(36)
                    .padding({
                      left: 15
                    })
                    .justifyContent(FlexAlign.Center)
                    .alignItems(HorizontalAlign.Start)
                  }
                }
                ListItem(){
                  ContactsRow({imagePath: $rawfile('start1.jpg'),titleString:'老婆'})
                    .padding({left:15,right:15})
                }
                .swipeAction({ end: this.itemEnd.bind(this, 0) })
                ListItem(){
                  ContactsRow({imagePath:$rawfile('start2.jpg'),titleString:'大甜'})
                    .padding({left:15,right:15})
                }.swipeAction({ end: this.itemEnd.bind(this, 1) })
                ListItem(){
                  ContactsRow({imagePath:$rawfile('start3.jpg'),titleString:'大甜'})
                    .padding({left:15,right:15})
                }.swipeAction({ end: this.itemEnd.bind(this, 2) })
              }
              .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })

              ForEach(this.fList,(item:object,index:number)=>{
                ListItemGroup({header:this.itemHead(item['letter'])}){
                  ForEach(item['data'],(p:object,i:number)=>{
                    ListItem(){
                      Flex({direction:FlexDirection.Row,alignItems:ItemAlign.Center}){
                        Image(p['avtar'])
                          .width(45)
                          .height(45)
                          .borderRadius(5)
                        Text(p['name'])
                          .fontSize(18)
                          .margin({left:10})
                      }
                      .height(55)
                    }
                    .onClick(()=>{
                      router.pushUrl({url:'pages/Contact/PersonalPage',params: {
                        person: p
                      }})
                    })
                  })
                }
                .divider({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })
                .padding({left:15,right:15})


![img](https://img-blog.csdnimg.cn/img_convert/a05f0a68b7a4cf3243fe3c911ac3b25a.png)
![img](https://img-blog.csdnimg.cn/img_convert/24574fd3f79df8493cdc41634f4be6a1.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

r({ strokeWidth: 2, color: 'rgb(247,247,247)', startMargin: 60, endMargin: 0 })
                .padding({left:15,right:15})


[外链图片转存中...(img-PP7GOGNw-1715633144332)]
[外链图片转存中...(img-vH6skpPr-1715633144333)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值