在 OpenHarmony(ArkUI) 里,并没有像 Android 那样专门的 ListView 控件,而是使用 List 组件 + ForEach / LazyForEach 来实现列表和分页。下面按常见做法给你说明。
@Entry
@Component
struct ListPage {
@State data: string[] = Array.from({ length: 100 }, (_, i) => `Item ${i}`)
build() {
List() {
ForEach(this.data, (item: string) => {
ListItem() {
Text(item)
.fontSize(20)
.padding(10)
}
})
}
}
}
⚠️ 如果数据量很大,ForEach 会一次性渲染,性能不好。
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.push(...data)
}
registerDataChangeListener() {}
unregisterDataChangeListener() {}
}
@Entry
@Component
struct PagedListPage {
@State dataSource = new MyDataSource()
private page = 1
private pageSize = 20
aboutToAppear() {
this.loadMore()
}
loadMore() {
const newData = Array.from(
{ length: this.pageSize },
(_, i) => `Item ${(this.page - 1) * this.pageSize + i}`
)
this.dataSource.addData(newData)
this.page++
}
build() {
List() {
LazyForEach(this.dataSource, (item: string) => {
ListItem() {
Text(item)
.fontSize(20)
.padding(10)
}
}, (item: string) => item)
}
.onReachEnd(() => {
this.loadMore()
})
}
}
✅ onReachEnd:列表滚动到底部时触发
✅ LazyForEach:只渲染可视区域,性能最好
Button('加载更多')
.onClick(() => {
this.loadMore()
})
适合不适合滚动加载的场景(如平板、电视)。
| 方式 | 是否推荐 | 说明 |
|---|---|---|
| ForEach | ❌ | 数据多会卡 |
| LazyForEach | ✅ | 官方推荐 |
| onReachEnd | ✅ | 自动分页 |
| 按钮分页 | ⚠️ | 特殊场景 |
如果你用的是 OpenHarmony 3.x / 4.x / 5.x,或者是在 Stage 模型 / FA 模型,我可以给你更精确的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。