HarmonyOS鸿蒙Next ArkUI基础篇-List刷新

HarmonyOS鸿蒙Next ArkUI基础篇-List刷新

对于List组件, 需要上拉加载,下拉刷新,需要Refresh组件来实现

@Entry
@Component
struct UseListPage {
  @State refreshing: boolean = false;
  @State listData: number[] = Array(30).fill(Date.now())

  // 自定义的刷新展示组件
  @Builder
  myRefreshBuilder() {
    Text("正在加载...")
      .width("100%")
      .textAlign(TextAlign.Center)
      .backgroundColor(Color.Gray)
  }

  build() {
    Column() {
      Refresh({ refreshing: $$this.refreshing, builder: this.myRefreshBuilder() }) {
        List() {

          ForEach(this.listData, (data: number, idx: number) => {
            ListItem() {
              Row() {
                Text(data + "")
              }
              .width("80%")
              .padding(20)
              .border({ width: { bottom: 2 }, color: Color.Gray })
            }
          })
        }
      }
    }
    .height('100%')
    .width('100%')
  }
}

一、下拉刷新

下拉后由于没有再修改状态,他会一直处于刷新的状态,这时需要调用Refresh的下拉事件onRefreshing,在处理之后修改刷新的状态

  • onRefreshing一般处理的是异步请求,所以这里暂时用定时器模拟一下
@Entry
@Component
struct UseListPage {
  @State refreshing: boolean = false;
  @State listData: number[] = Array(30).fill(Date.now())

  // 自定义的刷新展示组件
  @Builder
  myRefreshBuilder() {
    Text("正在加载...")
      .width("100%")
      .textAlign(TextAlign.Center)
      .backgroundColor(Color.Gray)
  }

  build() {
    Column() {
      Refresh({ refreshing: $$this.refreshing, builder: this.myRefreshBuilder() }) {
        List() {

          ForEach(this.listData, (data: number, idx: number) => {
            ListItem() {
              Row() {
                Text(data + "")
              }
              .width("80%")
              .padding(20)
              .border({ width: { bottom: 2 }, color: Color.Gray })
            }
          })
        }
      }
      .onRefreshing(() => {
        console.log("下拉成功")
        setTimeout(() => {
          this.refreshing = false
          console.log("定时任务触发")
        }, 1000)
      })
    }
    .height('100%')
    .width('100%')
  }
}

二、上拉加载

需要注册三个事件,这三个事件是在List本身

  • 开始滚动onScrollStart
  • 滚动结束onScrollStop
  • 滚动到列表结束的尾部onReachEnd

import { promptAction } from '@kit.ArkUI';

@Entry
@Component
struct UseListPage {
  @State listData: number[] = Array(30).fill(Date.now())
  @State isEnd: boolean = false

  // 自定义的刷新展示组件
  @Builder
  myRefreshBuilder() {
    Text("正在加载...")
      .width("100%")
      .textAlign(TextAlign.Center)
      .backgroundColor(Color.Gray)
  }

  build() {
    Column() {
      List() {

        ForEach(this.listData, (data: number, idx: number) => {
          ListItem() {
            Row() {
              Text(data + "")
            }
            .width("80%")
            .padding(20)
            .border({ width: { bottom: 2 }, color: Color.Gray })
          }
        })
      }
      .onScrollStart(() => {
        this.isEnd = false
      })
      .onScrollStop(() => {
        if (this.isEnd) {
          setTimeout(() => {
            this.listData.push(...Array(10).fill(Date.now()))
            promptAction.showToast({ message: "成功插入十条数据" })
          }, 1000)
        }
      })
      .onReachEnd(() => {
        this.isEnd = true
      })
    }
    .height('100%')
    .width('100%')
  }
}

上拉加载和下拉刷新整合后的代码

import { promptAction } from '@kit.ArkUI';

@Entry
@Component
struct UseListPage {
  @State refreshing: boolean = false;
  @State listData: number[] = Array(30).fill(Date.now())
  @State isEnd: boolean = false

  // 自定义的刷新展示组件
  @Builder
  myRefreshBuilder() {
    Text("正在加载...")
      .width("100%")
      .textAlign(TextAlign.Center)
      .backgroundColor(Color.Gray)
  }

  build() {
    Column() {
      Refresh({ refreshing: $$this.refreshing, builder: this.myRefreshBuilder() }) {
        List() {

          ForEach(this.listData, (data: number, idx: number) => {
            ListItem() {
              Row() {
                Text(data + "")
              }
              .width("80%")
              .padding(20)
              .border({ width: { bottom: 2 }, color: Color.Gray })
            }
          })
        }
        .onScrollStart(() => {
          this.isEnd = false
        })
        .onScrollStop(() => {
          if (this.isEnd) {
            setTimeout(() => {
              this.listData.push(...Array(10).fill(Date.now()))
              promptAction.showToast({ message: "成功插入十条数据" })
            }, 1000)
          }
        })
        .onReachEnd(() => {
          this.isEnd = true
        })
      }
      .onRefreshing(() => {
        console.log("下拉成功")
        setTimeout(() => {
          this.refreshing = false
          console.log("定时任务触发")
        }, 1000)
      })
    }
    .height('100%')
    .width('100%')
  }
}

更多关于HarmonyOS鸿蒙Next ArkUI基础篇-List刷新的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

更多关于HarmonyOS鸿蒙Next ArkUI基础篇-List刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


List刷新在HarmonyOS Next ArkUI中主要通过@State@Link装饰器实现数据驱动UI更新。使用ForEach渲染列表时,数据源变化会自动触发列表刷新。开发者可通过修改数组数据或调用this.array.splice()等方法更新列表项。ArkUI框架内置差异比对机制,仅更新变更项以提升性能。

在HarmonyOS Next的ArkUI中,实现List组件的下拉刷新和上拉加载需要结合Refresh组件和List的事件机制。以下是对代码实现的简要分析:

  1. 下拉刷新:通过Refresh组件的onRefreshing事件处理异步操作(如数据请求),并在操作完成后将refreshing状态设为false以结束刷新状态。示例中使用定时器模拟异步过程。

  2. 上拉加载:利用List的onReachEnd事件标记滚动到底部,结合onScrollStop触发数据加载。通过isEnd状态变量控制加载逻辑,避免重复触发。

整合后的代码将Refresh作为List的容器,同时处理下拉和上拉逻辑。注意异步操作(如setTimeout)需在UI线程外执行,避免阻塞渲染。实际应用中可替换为网络请求等异步任务。

代码结构清晰,事件处理合理,符合ArkUI的响应式设计原则。

回到顶部