温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!
private listeners: DataChangeListener[] = [];
registerDataChangeListener(listener: DataChangeListener): void {
if (!this.listeners.includes(listener)) {
this.listeners.push(listener);
}
}
unregisterDataChangeListener(listener: DataChangeListener): void {
const index = this.listeners.indexOf(listener);
if (index >= 0) {
this.listeners.splice(index, 1);
}
}
notifyDataReload(): void {
this.listeners.forEach(listener => {
listener.onDataReloaded(); // 触发LazyForEach全部刷新
});
}
notifyDataAdd(index: number): void {
this.listeners.forEach(listener => {
listener.onDataAdd(index); // 触发指定位置插入
});
}
private dataArray: T[] = [];
public pushData(data: T): void {
this.dataArray.push(data); // 数据压入数组
this.notifyDataAdd(this.dataArray.length - 1); // 通知最后位置新增
}
public clearAndPushAll(data: T[]): void {
this.dataArray = [...data]; // 全量替换数据
this.notifyDataReload(); // 触发全局刷新
}
public getData(index: number): T {
return this.dataArray[index]; // 支持索引访问
}
异常处理建议:
if (index >= this.totalCount()) {
throw new Error("Index out of bounds");
}
notifyDataMove(from: number, to: number): void {
this.listeners.forEach(listener => {
listener.onDataMove(from, to); // 触发动画效果
});
}
数据一致性:
性能陷阱:
// 错误示例:循环中频繁通知
data.forEach(item => {
this.addData(item); // 每次add都会触发渲染
});
// 正确做法:批量更新
this.dataArray = [...data];
this.notifyDataReload();
内存管理:
aboutToDisappear() {
this.dataSource.unregisterAllListeners();
}
分页加载实现:
class PagingDataSource extends CommonLazyDataSourceModel {
private currentPage = 0;
loadNextPage() {
fetchData(++currentPage).then(data => {
this.pushData(...data);
});
}
}
数据过滤功能:
filter(predicate: (item: T) => boolean) {
this.dataArray = this.dataArray.filter(predicate);
this.notifyDataReload();
}
该数据源实现方案通过:
完整构建了HarmonyOS应用的高效数据加载体系,适用于相册、商品列表、聊天记录等需要处理大量数据的场景。