第十一节HarmonyOS 常用容器组件2-List和Grid

news/2024/7/21 12:02:03 标签: harmonyos, 华为

一、List列表组件的使用

1、简介

     List是很常见的滚动类容器组件,一般和子组件ListItem一起使用,List列表中每一个列表项对应一个ListItem组件。

2、List组件使用ForEeach渲染列表

     一个列表往往由多个相似的Item项组成,所以一个List组件中包含多个子组件ListItem来构成,这样会导致。所以,使用循环渲染ForEeach遍历数组的方式来构建列表,这样就可以大大减少重复代码。以下是简单是示例代码:

@Entry
@Component
struct Control_list {
  private listArr: string[] = ["苹果", "香蕉", "哈密瓜", "葡萄", "草莓", "桃子"]

  build() {
    Row() {
      Column() {
        List({ space: 10 }) {
          ForEach(this.listArr, (item: string) => {
            ListItem() {
              Text(item)
                .width('100%')
                .height(100)
                .fontSize(20)
                .fontColor(Color.White)
                .textAlign(TextAlign.Center)
                .borderRadius(10)
                .backgroundColor(0x007DFF)
            }
          }, item => item)
        }

      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
    .padding(12)
    .height('100%')
    .backgroundColor(0xF1F3F5)
  }
}

效果如如下:

3、设置列表分割线

     List组件中子组件ListItem之间默认是没有分割线的,但是又有一些场景需要在两个子组件之间设置分割线,这时候您可以使用List组件的divider属性,

Divider属性包含四个参数:

  1. StrokeWidth:分割线的线宽。
  2. Color:分割线的颜色。
  3. StartMargin:分割线距离列表侧边起始端的距离。
  4. EndMargin:分割线距离列表侧边结束的距离。
List({ space: 10 }) {
  ForEach(this.listArr, (item: string) => {
    ListItem() {
      Text(item)
        .width('100%')
        .height(100)
        .fontSize(20)
        .fontColor(Color.White)
        .textAlign(TextAlign.Center)
        .borderRadius(10)
        .backgroundColor(0x007DFF)
    }
  }, item => item)
}
.divider({ strokeWidth: 2, color: Color.Red, startMargin: 16, endMargin: 16 })

4、List组件的滚动事件监听

     List组件提供了一系列的事件方法来监听列表的滚动,你可以根据业务的具体需要来监听某些事件。

  • onScroll:列表滑动时触发,返回值scrollOffSet为滑动偏移量,scrollState为当前滑动状态。
  • onScrollIndex:列表滑动时触发,返回值分别为滑动起始位置索引值与滑动结束位置索引值。
  • onReachStart:列表到达起始位置时触发。
  • onReachEnd:列表到达末尾位置时触发。
  • onScrollStop:列表滑动停止时触发。

示例代码:

@Entry
@Component
struct Control_list {
  private listArr: string[] = ["苹果", "香蕉", "哈密瓜", "葡萄", "草莓", "桃子", "西瓜", "凤梨", "菠萝", "荔枝"]

  build() {
    Row() {
      Column() {
        List({ space: 10 }) {
          ForEach(this.listArr, (item: string) => {
            ListItem() {
              Text(item)
                .width('100%')
                .height(100)
                .fontSize(20)
                .fontColor(Color.White)
                .textAlign(TextAlign.Center)
                .borderRadius(10)
                .backgroundColor(0x007DFF)
            }
          }, item => item)
        }
        .divider({ strokeWidth: 2, color: Color.Red, startMargin: 16, endMargin: 16 })
        .onScroll((scrollOffset: number, scrollState: ScrollState) => {
          console.info('zdm 滑动偏移量 scrollOffset' + scrollOffset)
          console.info('zdm 当前滑动状态 scrollState' + scrollState)
        })
        .onScrollIndex((start: number, end: number) => {
          console.info('zdm 滑动起始位置索引值 start' + start)
          console.info('zdm 滑动结束位置索引值 end' + end)
        })
        .onReachStart(() => {
          console.info('zdm 列表到达起始位置时触发 onReachStart')
        })
        .onReachEnd(() => {
          console.info('zdm 列表到达末尾位置时触发 onReachEnd')
        })
        .onScrollStop(() => {
          console.info('zdm 列表滑动停止时触发 onScrollStop')
        })

      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
    .padding(12)
    .height('100%')
    .backgroundColor(0xF1F3F5)
  }
}

刚运行显示出页面时效果图:

此时打印日志:

列表向下滑动到底时,此期间日志:

……

五、设置List排列方向

     List组件里列表默认是按垂直方向(从上到下)排列的,如果这时您想让列表水平排列,您可以将list组件中listDirection属性设置为“Axis.Horizontal”。

.listDirection(Axis.Horizontal)
.listDirection(Axis.Vertical)

listDirection参数类型是Axis,定义了以下两种类型:

  • Vertical(默认):子组件ListItem在组件List中呈纵向排列。

  • Horizonal:子组件ListItem在组件List中呈横向排列。

二、Grid网格组件使用

1、简介

Grid组件为网格容器,是一种网格列表;由“行”和“列”分割的单元格所组成,通过指定“项目”所在的单元格做出各种各样的布局。Grid组件一般和子组件GridItem一起使用,Grid列表中的每一个条目对应一个GridItem组件。

2、使用ForEeach渲染网格布局

和List组件一样,Grid组件也可以使用ForEach来渲染多个列表项GridItem,我们通过下面的这段示例代码来介绍Grid组件的使用。

示例代码:

@Entry
@Component
struct ControlGrid {
  private listArr: string[] = ["苹果", "香蕉", "哈密瓜", "葡萄", "草莓", "桃子", "西瓜", "凤梨", "菠萝", "荔枝"]

  build() {
    Row() {
      Column() {
        Grid() {
          ForEach(this.listArr, (item: string) => {
            GridItem() {
              Text(item)
                .width('100%')
                .height('100%')
                .fontSize(20)
                .fontColor(Color.White)
                .textAlign(TextAlign.Center)
                .borderRadius(10)
                .backgroundColor(0x007DFF)
            }
          }, item => item)
        }
        .columnsTemplate('1fr 1fr 1fr 1fr')
        .rowsTemplate('1fr 1fr')
        .columnsGap(10)
        .rowsGap(10)
        .height(300)
        .backgroundColor(Color.Gray)

      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
    .padding(12)
    .height('100%')
    .backgroundColor(0xF1F3F5)
  }
}

效果图:

        注意:示例代码中创建了10个GridItem列表项。同时设置columnsTemplate的值为'1fr 1fr 1fr 1fr',表示这个网格为4列,将Grid允许的宽分为4等分,每列占1份;rowsTemplate的值为'1fr 1fr',表示这个网格为2行,将Grid允许的高分为2等分,每行占1份。这样就构成了一个2行4列的网格列表,然后使用columnsGap设置列间距为10vp,使用rowsGap设置行间距也为10vp。(由于设置2行4列固定网格,这就导致只能显示出来8条,上述代码且不能滚动)。

        上面构建的网格布局使用了固定的行数和列数,所以构建出的网格是不可滚动的。然而有时候因为内容较多,我们通过滚动的方式来显示更多的内容,就需要一个可以滚动的网格布局。我们只需要设置rowsTemplate和columnsTemplate中的一个即可

        将示例代码中owsTemplate属性删除,由于高度已经是固定值了,所以就可以实现Grid列表的滚动:

上述是代码变动处。

修改后效果如:

此外 -- Grid像List一样也可以使用onScrollIndex来监听列表的滚动


http://www.niftyadmin.cn/n/5236336.html

相关文章

C语言--每日选择题--Day33

第一题 1. 在以下给出的表达式中&#xff0c;与do-while(E)语句中的(E)不等价的表达式是&#xff08; &#xff09; A&#xff1a;(!E 0) B&#xff1a;(E > 0 || E < 0) C&#xff1a;(E 0) D&#xff1a;(E ! 0) 答案及解析 C 首先要知道(E)这个条件成立无非两种&…

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建私有网盘 Nextcloud系统

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

维基百科文章爬虫和聚类:高级聚类和可视化

一、说明 维基百科是丰富的信息和知识来源。它可以方便地构建为带有类别和其他文章链接的文章&#xff0c;还形成了相关文档的网络。我的 NLP 项目下载、处理和应用维基百科文章上的机器学习算法。 在我的上一篇文章中&#xff0c;KMeans 聚类应用于一组大约 300 篇维基百科文…

【C语言学习疑难杂症】第9期:关于%*s以及%*d等的使用

关于%*s的使用的一些问题 int a,b; scanf("%2d%*3s%2d", &a, &b);//123456789 printf("%d%d", a, b);//1267 scanf("%2d%*2s%2d", &a, &b);//123456789 printf("%d%d", a, b);//1256 scanf("%2d%*s%2d"…

leetcode - 矩阵区域和

1314. 矩阵区域和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c …

【使用Selenium爬取视频】

使用Selenium爬取视频 先确定网站 先确定你需要爬取的视频在确定网站的url &#xff0c;因为视频的url可能会多次跳转。所以需要多次检查并且找到真正的url 书写代码&#xff1a; import time from selenium import webdriver from selenium.webdriver.common.by import By…

“此应用专为旧版android打造,因此可能无法运行”,问题解决方案

当用户在Android P系统上打开某些应用程序时&#xff0c;可能会弹出一个对话框&#xff0c;提示内容为&#xff1a;“此应用专为旧版Android打造&#xff0c;可能无法正常运行。请尝试检查更新或与开发者联系”。 随着Android平台的发展&#xff0c;每个新版本通常都会引入新的…

[RoFormer]论文实现:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING

文章目录 一、完整代码二、论文解读2.1 注意力机制2.2 绝对位置编码2.3 相对位置编码2.4 旋转位置编码Long-term decayAdaption for linear attention 2.5 模型效果 三、过程实现四、整体总结 论文&#xff1a;ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING …