HarmonyOS鸿蒙Next中list数据加载问题

HarmonyOS鸿蒙Next中list数据加载问题

数组有几百个元素但是页面只显示一个

```javascript
[@Styles](/user/Styles) listStyles(){
  #list
    backgroundColor(Yellow)
    margin({top:10})
    alignRules({
      top:{anchor:'search',align:VerticalAlign.Bottom},
      left:{anchor:LayoutUtil.Container,align:HorizontalAlign.Start},
      bottom:{anchor:LayoutUtil.Container,align:VerticalAlign.Bottom},
      right:{anchor:LayoutUtil.Container,align:HorizontalAlign.End}
    })
}
RelativeContainer() {
  List() {
    ListItemGroup(){
      ForEach(this.searchResult, (item: object, index: number) => {
        ListItem() {
          RelativeContainer() {
            Image(item['profile_image_url'])
              alt($rawfile('Contacts/ice_group_people_default_head.png'))
              width(40)
              height(40)
              borderRadius(5)
              margin({ left: 15, top: 5, bottom: 5 })
              id('header')

            Text(item['name'])
              fontSize(14)
              height(20)
              textAlign(TextAlign.Start)
              id('name')
              alignRules({
                left: { anchor: 'header', align: HorizontalAlign.End },
                right: { anchor: LayoutUtil.Container, align: HorizontalAlign.End },
                top: { anchor: 'header', align: VerticalAlign.Top }
              })
              margin({ right: 15, left: 10 })

            Text(item['company_name'] + '/' + item['org_name'] + '/' + item['position'])
              fontSize(12)
              textAlign(TextAlign.Start)
              maxLines(2)
              id('info')
              alignRules({
                left: { anchor: 'name', align: HorizontalAlign.Start },
                top: { anchor: 'name', align: VerticalAlign.Bottom },
                right: { anchor: 'name', align: HorizontalAlign.End }
              })
              margin({ top: 8,right: 20 })
            Divider().height(0.5).backgroundColor(0xDDDDDD).id('dev')
              alignRules({
                top:{anchor:'info',align:VerticalAlign.Bottom},
                left:{anchor:'header',align:HorizontalAlign.End},
                right:{anchor:'info',align:HorizontalAlign.End}
              })
              margin({top:8,right:20})
          }
        }
      })
    }
  }
  .listStyles()
}

更多关于HarmonyOS鸿蒙Next中list数据加载问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

1、可以为foreach加上keyGenerator函数,保证键值唯一性:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-rendering-control-foreach-V5# 键值生成规则

2、可以先给listItem设置一个高度看看,ListItem(){...}.height(100) 这边试了你demo好像是全屏显示的,可能会以为只显示了一条数据。

如果你不设置listItem的高度,现在一条数据就是显示一整页,导致你以为只展示了一条数据,对吧

感觉这个和你在ListItem里使用的RelativeContainer组件有关系,如果将ListItem下面的RelativeContainer换成Column,ListItem是可以自适应高度的。

build() {

  List() {

    ForEach([1, 2, 3, 4], (item: number) => {

      ListItem() {

        Column() {

          Text('高度100')
            .fontSize(14)
            .height(20)
            .fontSize(14)
            .textAlign(TextAlign.Start)
            .width('100%')
            .height(100)
            .backgroundColor(Color.Yellow)

          Text('高度占满')
            .fontSize(14)
            .height(20)
            .fontSize(14)
            .textAlign(TextAlign.Start)
            .backgroundColor(Color.Pink)
            .width('100%')
            .flexGrow(1) // 设置组件在父容器的剩余空间所占比例

        }
        .width('100%')
        .height(300)

      }

    })

  }

}

Column、Row、 Flex组件都可以通过Flex布局控制子元素显示,文档参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-flex-la

更多关于HarmonyOS鸿蒙Next中list数据加载问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,list数据加载问题通常涉及数据源与UI组件的绑定、异步加载、以及数据更新时的UI刷新机制。鸿蒙提供了ListContainer组件用于展示列表数据,数据加载可以通过ListContainer.DataSource接口实现。开发者需要实现DataSourceonItemAtgetCount方法,分别用于获取指定位置的数据项和返回列表的总项数。

在数据加载过程中,如果数据量较大,建议使用异步加载机制,避免阻塞UI线程。鸿蒙提供了TaskDispatcher用于处理异步任务,开发者可以通过ParallelTaskDispatcherSerialTaskDispatcher将数据加载任务分发到后台线程执行,加载完成后通过UITaskDispatcher将结果更新到UI。

对于数据更新,鸿蒙的ListContainer支持通过notifyDataChanged方法通知UI刷新。开发者可以在数据变化时调用该方法,确保UI与数据同步。此外,鸿蒙还提供了ComponentObserver机制,允许开发者监听数据变化,自动触发UI更新。

如果遇到数据加载性能问题,可以考虑使用LazyColumnLazyList等懒加载组件,仅在用户滚动时加载可见区域的数据,减少内存占用和初始加载时间。

总之,鸿蒙Next中的list数据加载主要依赖于ListContainerDataSource机制,结合异步任务分发和UI刷新机制,能够有效处理大规模数据的加载与展示。

在HarmonyOS鸿蒙Next中,处理List数据加载时,建议使用LazyForEach组件来实现高效的数据渲染。LazyForEach支持懒加载,仅渲染当前可见的列表项,提升性能。确保数据源实现IListDataSource接口,并在onDataArrived中更新数据。此外,合理使用ListItemListContainer组件,避免频繁刷新整个列表,优化用户体验。

回到顶部