鸿蒙开发:案例集合List:模拟附近人列表插入

🎯 案例集合List:模拟附近人列表插入

🌍 案例集合List

🚪 最近开启了学员班级点我欢迎加入

🏷️ 效果图(录制有点掉帧)

📖 参考

🧩 拆解

  • 从列表前面插入(后续会增加高性能的方式)
javascript 复制代码
@Component
export struct ListItemUnshiftAnimation {
  /**
   * 模拟数据
   */
  @State mockData: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  /**
   * 监听是否滑动到List顶部
   */
  @State @Watch('isListTopChange') isListTop: boolean = false
  /**
   * 定时器ID
   */
  @State timerId: number = -1

  /**
   * 滑动到头开启延时器追加数据
   */
  isListTopChange() {
    if (this.isListTop) {
      this.timerId = setInterval(() => {
        this.getUIContext().animateTo({ duration: 300, curve: Curve.Smooth }, () => {
          this.mockData.unshift(this.mockData.length + 1)
        })
      }, 2000)
    }
  }

  /**
   * 模拟Swipe组件或者banner组件
   */
  @Builder
  mockSwipeBuilder() {
    Stack({ alignContent: Alignment.Center }) {
      Image($r('app.media.startIcon'))
        .width('100%')
        .height(200)
        .draggable(false)
        .borderRadius(10)
      Text('模拟Swipe组件')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
    }
    .height(200)
    .width('100%')
  }

  aboutToDisappear(): void {
    this.isListTop = false // 关闭追加数据
    clearInterval(this.timerId) // 清空延时器
  }

  build() {
    Column() {
      this.mockSwipeBuilder()

      List({ space: 20 }) {
        ListItem() // 这里处理是否滑动到顶部占位组件
        ForEach(this.mockData, (item: number) => {
          ListItem() {
            Text(item.toString())
              .height(150)
              .width('100%')
              .borderRadius(10)
              .backgroundColor(Color.Orange)
              .textAlign(TextAlign.Center)
          }
          // 170 = 150的组件高度 20的组件边距,这样设置不会有挤压 | 割裂的效果
          .transition(TransitionEffect.OPACITY.combine(TransitionEffect.translate({ y: -170 })))

          // 这里在实际业务中需要取字段中的唯一做标识,不然会有很奇怪的问题
        }, (item: number) => item.toString())
      }
      .cachedCount(1, true) // 预加载数量1,true代表需要显示
      .width('100%')
      .layoutWeight(1)
      .scrollBar(BarState.Off) // 关闭滚动条
      .onReachStart(() => this.isListTop = true) // 是否滑动到头
      .onScrollIndex(() => {
        this.isListTop = false // 关闭追加数据
        clearInterval(this.timerId) // 清空延时器
      })
    }
    .height('100%')
    .width('100%')
  }
}

🌸🌼🌺

相关推荐
今儿敲了吗2 小时前
鸿蒙开发第一章学习笔记
笔记·学习·鸿蒙
一起养小猫3 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
森之鸟4 小时前
多智能体系统开发入门:用鸿蒙实现设备间的AI协同决策
人工智能·harmonyos·m
jin1233224 小时前
React Native鸿蒙跨平台完成剧本杀组队详情页面,可以复用桌游、团建、赛事等各类组队详情页开发
javascript·react native·react.js·ecmascript·harmonyos
_waylau4 小时前
【HarmonyOS NEXT+AI】问答08:仓颉编程语言是中文编程语言吗?
人工智能·华为·harmonyos·鸿蒙·仓颉编程语言·鸿蒙生态·鸿蒙6
前端菜鸟日常5 小时前
鸿蒙开发实战:100 个项目疑难杂症汇编
汇编·华为·harmonyos
jin1233225 小时前
基于React Native鸿蒙跨平台移动端表单类 CRUD 应用,涵盖地址列表展示、新增/编辑/删除/设为默认等核心操作
react native·react.js·ecmascript·harmonyos
摘星编程7 小时前
OpenHarmony环境下React Native:DatePicker日期选择器
react native·react.js·harmonyos
一起养小猫7 小时前
Flutter for OpenHarmony 实战:番茄钟应用完整开发指南
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
一起养小猫8 小时前
Flutter for OpenHarmony 实战:数据持久化方案深度解析
网络·jvm·数据库·flutter·游戏·harmonyos