在 OpenHarmony(ArkUI) 里,并没有像 Android 那样的 ListView 控件,而是使用 List + ForEach 来展示列表。所谓“ListView 排序”,本质上是对数据源进行排序,然后重新渲染 List。
下面按常见场景给你说明。
class Item {
id: number
name: string
age: number
constructor(id: number, name: string, age: number) {
this.id = id
this.name = name
this.age = age
}
}
@State 保存列表数据@Entry
@Component
struct ListViewSortExample {
@State items: Item[] = [
new Item(1, "张三", 20),
new Item(2, "李四", 18),
new Item(3, "王五", 25)
]
build() {
Column() {
Button("按年龄排序")
.onClick(() => {
this.items.sort((a, b) => a.age - b.age)
})
List() {
ForEach(this.items, (item: Item) => {
ListItem() {
Text(`${item.name} - ${item.age}`)
.fontSize(18)
.padding(10)
}
})
}
}
}
}
✅ 关键点:
List 只是展示items 上@State 会触发 UI 刷新@State sortAsc: boolean = true
Button("切换排序")
.onClick(() => {
this.sortAsc = !this.sortAsc
this.items.sort((a, b) =>
this.sortAsc ? a.age - b.age : b.age - a.age
)
})
this.items.sort((a, b) =>
a.name.localeCompare(b.name, "zh-Hans-CN")
)
避免直接修改原数组:
this.items = [...this.items].sort((a, b) => a.age - b.age)
| 错误做法 | 原因 |
|---|---|
| 在 List 里排序 | List 不负责数据逻辑 |
| 直接改数组不触发刷新 | 没用 @State |
| 用 index 排序 | 数据变化时易乱 |
如果你指的是 OpenHarmony 3.x 的 ListContainer,也可以告诉我,我可以给你老写法示例。
OpenHarmony 中 ListView 排序 = 对 @State 数组排序
如果你有具体排序规则(比如多字段、分组、懒加载),可以继续问我。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。