// 错误示例 - LazyForEach 使用 string[] 直接报错
@Entry
@Component
struct IDataSourceErrorExample {
private data: string[] = ['Item 1', 'Item 2', 'Item 3'];
build() {
Column() {
List() {
LazyForEach(this.data, (item: string) => {
ListItem() {
Text(item)
}
}, (item: string) => item)
}
.width('100%')
.height('100%')
}
}
}
// 解决方案 - 实现 IDataSource 接口
class MyDataSource {
data: string[] = [];
private listeners: DataChangeListener[] = [];
totalCount(): number {
return this.data.length;
}
getData(index: number): string {
return this.data[index];
}
registerDataChangeListener(listener: DataChangeListener): void {
this.listeners.push(listener);
}
unregisterDataChangeListener(listener: DataChangeListener): void {
const index = this.listeners.indexOf(listener);
if (index > -1) {
this.listeners.splice(index, 1);
}
}
pushData(data: string): void {
this.data.push(data);
this.listeners.forEach((listener: DataChangeListener) => {
listener.onDataAdd?.(this.data.length - 1);
});
}
}
@Entry
@Component
struct IDataSourceCorrectExample {
private data: MyDataSource = new MyDataSource();
aboutToAppear() {
for (let i = 0; i < 100; i++) {
this.data.pushData(`Item ${i}`);
}
}
build() {
Column() {
List() {
LazyForEach(this.data, (item: string) => {
ListItem() {
Text(item).fontSize(20).padding(10)
}
}, (item: string) => item)
}
.cachedCount(5)
.width('100%')
.height('100%')
}
}
}