在 OpenHarmony(ArkUI) 里,并没有像 Android 那样直接的 ListView 控件,而是使用 List + ForEach / LazyForEach 来实现列表。分页通常有两种常见方式:
适合移动端长列表
核心思路:
dataList@Entry
@Component
struct PageExample {
@State dataList: string[] = Array.from({ length: 20 }, (_, i) => `Item ${i}`)
@State loading: boolean = false
private page: number = 1
loadMore() {
if (this.loading) return
this.loading = true
// 模拟网络请求
setTimeout(() => {
const newData = Array.from({ length: 10 }, (_, i) => `Item ${this.dataList.length + i}`)
this.dataList = this.dataList.concat(newData)
this.page++
this.loading = false
}, 1000)
}
build() {
Column() {
List() {
ForEach(this.dataList, (item: string) => {
ListItem() {
Text(item)
.fontSize(18)
.padding(12)
}
})
if (this.loading) {
ListItem() {
Text('加载中...')
.fontSize(14)
.padding(12)
}
}
}
.onReachEnd(() => {
this.loadMore()
})
}
}
}
✅ 关键点:
onReachEnd():滚动到底部触发loading 防止重复请求适合后台管理或数据量不大
@State page: number = 1
@State dataList: string[] = []
loadPage(page: number) {
// 请求第 page 页数据
}
Button('上一页').onClick(() => {
if (this.page > 1) {
this.page--
this.loadPage(this.page)
}
})
Button('下一页').onClick(() => {
this.page++
this.loadPage(this.page)
})
class MyDataSource implements IDataSource {
private list: string[] = []
totalCount(): number {
return this.list.length
}
getData(index: number): string {
return this.list[index]
}
addData(data: string[]) {
this.list = this.list.concat(data)
}
}
配合 onReachEnd() 使用,效果最佳。
| 场景 | 推荐方式 |
|---|---|
| 移动端长列表 | 上拉加载(onReachEnd) |
| 数据量小 | 页码按钮 |
| 大数据 | LazyForEach + 分页 |
如果你能提供:
我可以给你一个完整可直接运行的分页 Demo。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。