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
List刷新在HarmonyOS Next ArkUI中主要通过@State
和@Link
装饰器实现数据驱动UI更新。使用ForEach
渲染列表时,数据源变化会自动触发列表刷新。开发者可通过修改数组数据或调用this.array.splice()
等方法更新列表项。ArkUI框架内置差异比对机制,仅更新变更项以提升性能。
在HarmonyOS Next的ArkUI中,实现List组件的下拉刷新和上拉加载需要结合Refresh组件和List的事件机制。以下是对代码实现的简要分析:
-
下拉刷新:通过Refresh组件的
onRefreshing
事件处理异步操作(如数据请求),并在操作完成后将refreshing
状态设为false
以结束刷新状态。示例中使用定时器模拟异步过程。 -
上拉加载:利用List的
onReachEnd
事件标记滚动到底部,结合onScrollStop
触发数据加载。通过isEnd
状态变量控制加载逻辑,避免重复触发。
整合后的代码将Refresh作为List的容器,同时处理下拉和上拉逻辑。注意异步操作(如setTimeout)需在UI线程外执行,避免阻塞渲染。实际应用中可替换为网络请求等异步任务。
代码结构清晰,事件处理合理,符合ArkUI的响应式设计原则。