鸿蒙开发:如何实现列表吸顶

程序员一鸣
• 阅读 2

前言

本文基于Api13

列表吸顶功能,在实际的开发中有着很大的作用,比如可以让列表层级之间更加分明,减少一定程度上的视觉混乱,由于吸顶的标题会随着滚动固定在顶部,可以让用户无需反复滑动回顶部确认分组位置,方便实时定位当前分组,可以说还是非常方便的;常见的场景有联系人的页面,电商软件的购物车等。

鸿蒙当中实现一个列表吸顶,很是简单,官方为我们提供了ListItemGroup组件,使用它,便可以轻松搞定,我们可以先来看一个简单的案例:

interface CityData {
  name: string;
  address: string[];
}

@Entry
@Component
struct Index {
  private cityData: CityData[] = [
    {
      name: '北京市',
      address: ['朝阳区', '东城区', '西城区']
    }, {
    name: '河北省',
    address: ['石家庄', '保定市', '唐山市']
  }, {
    name: '河南省',
    address: ['郑州市', '商丘市', '洛阳市', '开封市']
  }, {
    name: '山西省',
    address: ['太原市', '晋城市', '大同市', '长治市']
  }
  ]

  @Builder
  itemHead(text: string) {
    Text(text)
      .fontSize(18)
      .height(40)
      .fontColor(Color.White)
      .backgroundColor(Color.Orange)
      .width('100%')
  }

  //组件使用
  build() {
    Column() {
      List() {
        ForEach(this.cityData, (item: CityData) => {
          ListItemGroup({ header: this.itemHead(item.name) }) {
            ForEach(item.address, (address: string) => {
              ListItem() {
                Text(address)
                  .width("100%")
                  .height(80)
                  .fontSize(16)
                  .textAlign(TextAlign.Center)
              }
            }, (item: string) => item)
          }
          .divider({ strokeWidth: 1, color: Color.Gray })
        })
      }
      .width("100%")
      .sticky(StickyStyle.Header)
      .scrollBar(BarState.Off)
    }.width("100%")
    .height("100%")
  }
}

运行之后,效果如下:

鸿蒙开发:如何实现列表吸顶

从以上的案例中我们可以看到,ListItemGroup组件是必须要结合List组件一起使用的,这一点一定要知晓,下面,针对ListItemGroup组件,我们就一起来探究一下吧。

ListItemGroup使用方式

通过源码,我们可以看到,ListItemGroup组件接收了一个ListItemGroupOptions参数。

/**
    * Called when interface is called.
    *
    * @param { ListItemGroupOptions } options
    * @returns { ListItemGroupAttribute }
    * @syscap SystemCapability.ArkUI.ArkUI.Full
    * @crossplatform
    * @atomicservice
    * @since 11
    */
   (options?: ListItemGroupOptions): ListItemGroupAttribute;

ListItemGroupOptions可选择的属性如下,一般最常用的就是header属性,也就是吸顶时的标题栏组件。

名称 类型 必填 说明
header CustomBuilder ListItemGroup头部组件。
headerComponent13+ ComponentContent 使用ComponentContent类型参数设置ListItemGroup头部组件。
footer CustomBuilder 设置ListItemGroup尾部组件。
footerComponent13+ ComponentContent 使用ComponentContent类型参数设置ListItemGroup尾部组件。
space number / string 列表项间距。只作用于ListItem与ListItem之间,不作用于header与ListItem、footer与ListItem之间。默认值:0单位:vp
style10+ ListItemGroupStyle 设置List组件卡片样式。默认值:ListItemGroupStyle.NONE

我们可以把前言中的案例改造一下,加一个footer属性:

ListItemGroup({
            header: this.itemHead(item.name),
            footer: this.itemFooter(item.address.length.toString())
          })

尾部组件视图:

@Builder
itemFooter(text: string) {
  Text("一共有" + text + "个地址")
    .fontSize(18)
    .height(20)
    .fontColor(Color.White)
    .backgroundColor(Color.Red)
    .width('100%')
}

运行之后,效果如下:

鸿蒙开发:如何实现列表吸顶

headerComponent和footerComponent参数,和header与footer功能一样,都是用于头或者尾组件,但是,他们的优先级高于后者,也就是如果你同时设置了他们,在实际的效果中会以前者为准。

headerComponent和footerComponent参数接收了一个ComponentContent参数,使用它,我们可以共用一个公共的视图组件,因为它可以接受一个wrapBuilder参数。

比如上述的代码,我们使用headerComponent代替header,运行之后可以发现,其实效果是一样的。

headerComponent: new ComponentContent(this.getUIContext(), wrapBuilder(buildHeader), item.name)

除此之外,还有一个style属性,使用它,可以实现一个卡片样式的效果:

style: ListItemGroupStyle.CARD

设置后,会展示如下的卡片效果:

鸿蒙开发:如何实现列表吸顶

refresh库实现

refresh库是我开发的一个列表刷新加载库,上架一年多来,已经有三万多次的下载量,获得了很多开发者的一致好评,如果您也感兴趣,可以访问如下的refresh库地址,里面有详细的使用方式:

https://ohpm.openharmony.cn/#/cn/detail/@abner%2Frefresh

使用刷新库,实现一个列表吸顶也是非常的简单,具体使用如下:

ListView({
        controller: this.controller, //刷新控制器
        itemGroupHeader: this.itemHead, //分组头
        itemGroupData: this.cityData, //分组数据
        itemLayout: this.itemLayout, //内容视图
        onRefresh: () => {
          setTimeout(() => {
            //模拟耗时
            this.controller.finishRefresh()
          }, 2000)
        },
        onLoadMore: () => {
          setTimeout(() => {
            //模拟耗时
            this.controller.finishLoadMore()
          }, 2000)
        }
      })

效果如下:

鸿蒙开发:如何实现列表吸顶

相关总结

ListItemGroup组件的使用,可以说是非常的简单,如果仅仅是普通的吸顶,建议直接使用即可,如果您需要带有下拉刷新和上拉加载效果的,可以使用refresh组提供的,在使用原生的时候,有一点需要注意,那就是需要设置List组件的sticky属性,否则吸顶效果是不生效的。

.sticky(StickyStyle.Header|StickyStyle.Footer)

StickyStyle属性介绍如下:

名称 说明
None 0 header不吸顶,footer不吸底。
Header 1 header吸顶,footer不吸底。
Footer 2 footer吸底,header不吸顶。

本文标签:HarmonyOS/ArkUI

点赞
收藏
评论区
推荐文章
红橙Darren 红橙Darren
3年前
RecyclerView更全解析之 - 打造通用的下拉刷新上拉加载
1.概述这期我们在上一期的的基础上再去增加功能,我相信我们在真正的实践开发过程中肯定少不了下拉刷新和上拉加载。  我们需要思考一个问题上拉刷新下拉加载风格各式各样,淘宝和京东的列表刷新样式就肯定不一样,我们怎么样做到版本迭代的时候可以快速的更改样式。有时还需要显示正在加载数据或者无数据,比如筛选的时候有可能会出现没有数据的情况会显示无数据页面,怎么快
Stella981 Stella981
3年前
FlutterDojo设计之道—状态管理之路(七)
Provider在列表中使用在前面的讲解中,我们大部分的场景都是在普通的Box布局中,相信大家对Provider的使用已经非常清楚了,下面来看下在List中的使用场景,相信对于很多App来说,列表应该是大部分页面的核心UI,所以,到底如何在列表的「下拉刷新」、「上拉加载更多」、「Item点击修改状态」这几种场景下来使用Pro
Stella981 Stella981
3年前
JVM 字节码指令表
字节码助记符指令含义0x00nop什么都不做0x01aconst\_null将null推送至栈顶0x02iconst\_m1将int型1推送至栈顶0x03iconst\_0将int型0推送至栈顶0x04iconst\_1将int型1推送至栈顶0x05ic
程序员一鸣 程序员一鸣
13小时前
鸿蒙开发:使用nestedScroll解决滑动冲突
在实际的开发中,远远要比前边的案例复杂,比如我之前封装的刷新库,滚动组件上面有刷新头,下面也有加载尾,还有更复杂的,列表吸顶操作等等,一个nestedScroll属性是远远不够的,往往还要和滑动监听,是否滚动到了顶部和尾部等相结合,才能实现我们实际的效果。
布局王 布局王
13小时前
Uniapp开发鸿蒙购物应用教程之商品列表
今天要分享的依然是使用uniapp跨平台开发鸿蒙应用的系列教程,今天要做的是实现首页的商品列表,效果图如下:今天的内容分为两部分,一部分是中间的商品分类,还有下方商品列表,不过这两部分其实是相同的布局方式,都是网格布局。在鸿蒙原生开发中我们都使用过grid
布局王 布局王
13小时前
鸿蒙Next仓颉语言开发实战教程:下拉刷新和上拉加载更多
在移动应用中,各种列表页面离不开下拉刷新和上拉加载更多,我们的商城应用也是如此。今天介绍一下在仓颉开发语言中如何实现这一功能。下拉刷新仓颉开发语言直接提供了下拉刷新的组件,叫做Refresh,使用起来也非常方便:@StatevarheaderLoading
程序员一鸣 程序员一鸣
13小时前
鸿蒙开发:实现一个标题栏吸顶
本身并不难,处理好滑动位置和手势即可,当然了,里面也有两个注意的点,一个是解决手势冲突的nestedScroll,这个之前的文章中讲过,还有一个就是拦截瀑布流组件的滑动事件,在某些状态下禁止它的滑动。
GeorgeGcs GeorgeGcs
2小时前
【HarmonyOS 5】如何开启DevEco Studio热更新调试应用模式
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、AttributeModifier和AttributeUpdater的定义和作用1.AttributeModifier是ArkUI组件的动态属性,提供属性设置功能。开发者可使用attr
程序员一鸣 程序员一鸣
2个月前
鸿蒙开发:使用Rect绘制矩形
几何矩形,在实际的开发中,有多种的实现方式,并非一定需要Rect组件,但是,如果有需要用到矩形的场景,建议还是使用Rect组件,因为Rect组件自身携带了很多样式属性,可以满足我们日常的不同的需求。
程序员一鸣 程序员一鸣
2星期前
鸿蒙开发:了解@Builder装饰器
@Builder装饰是鸿蒙UI开发中,非常重要的一个装饰器,在实际的开发中,合理且正确的使用,能够让我们的代码更加的简洁,有两点需要注意,一是,是用私有还是全局,取决于当前的组件的复用机制,如果多个页面都使用了,建议以全局为主;二是传参的动态更新,有更新就使用引用参数传递,没有更新按值传递即可。