五笔打字通主页
以下代码处理的数据类型为泛型:
// BasicDataSource实现了IDataSource接口,用于管理listener监听,以及通知LazyForEach数据更新
// 以下2个类(BasicDataSource,MyDataSource),用于懒加载的data数据处理
class BasicDataSource<T> implements IDataSource {
private listeners: DataChangeListener[] = [];
private originDataArray: T[] = [];
public totalCount(): number {
return 0;
}
public getData(index: number): T {
return this.originDataArray[index];
}
// 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
registerDataChangeListener(listener: DataChangeListener): void {
if (this.listeners.indexOf(listener) < 0) {
console.info('add listener');
this.listeners.push(listener);
}
}
// 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
unregisterDataChangeListener(listener: DataChangeListener): void {
const pos = this.listeners.indexOf(listener);
if (pos >= 0) {
console.info('remove listener');
this.listeners.splice(pos, 1);
}
}
// 通知LazyForEach组件需要重载所有子组件
notifyDataReload(): void {
this.listeners.forEach(listener => {
listener.onDataReloaded();
})
}
// 通知LazyForEach组件需要在index对应索引处添加子组件
notifyDataAdd(index: number): void {
this.listeners.forEach(listener => {
listener.onDataAdd(index);
// 写法2:listener.onDatasetChange([{type: DataOperationType.ADD, index: index}]);
})
}
// 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件
notifyDataChange(index: number): void {
this.listeners.forEach(listener => {
listener.onDataChange(index);
// 写法2:listener.onDatasetChange([{type: DataOperationType.CHANGE, index: index}]);
})
}
// 通知LazyForEach组件需要在index对应索引处删除该子组件
notifyDataDelete(index: number): void {
this.listeners.forEach(listener => {
listener.onDataDelete(index);
// 写法2:listener.onDatasetChange([{type: DataOperationType.DELETE, index: index}]);
})
}
// 通知LazyForEach组件将from索引和to索引处的子组件进行交换
notifyDataMove(from: number, to: number): void {
this.listeners.forEach(listener => {
listener.onDataMove(from, to);
// 写法2:listener.onDatasetChange(
// [{type: DataOperationType.EXCHANGE, index: {start: from, end: to}}]);
})
}
notifyDatasetChange(operations: DataOperation[]): void {
this.listeners.forEach(listener => {
listener.onDatasetChange(operations);
})
}
}
class MyDataSource<T> extends BasicDataSource<T> {
private dataArray: T[] = [];
public totalCount(): number {
return this.dataArray.length;
}
public getData(index: number): T {
return this.dataArray[index];
}
public pushData(data: T): void {
this.dataArray.push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
public pushAllData(data: T[]): void {
for (let index = 0; index < data.length; index++) {
this.pushData(data[index])
}
}
}
@Entry
@Component
struct Page8 {
//要懒加载的数据 data 必须要经过 MyDataSource 处理一下才行。
private data: MyDataSource<string> = new MyDataSource<string>();
aboutToAppear() {
// //加载数据有3种方法,方法1:
const array: string[] = []
for (let i = 0; i <= 10000; i++) {
array.push(`Hello ${i}`)
}
this.data.pushAllData(array)
// //方法2 - 源码来自 wb98.com
// const array =
// ['中国', '美国', '英国', '法国', '俄罗斯', '德国', '新西兰', '哥伦比亚', '新加坡', '日本', '越南', '加拿大',
// '乌克兰',
// '南非', '埃及', '泰国', '澳大利亚', '智利', '巴西', '冰岛']
// this.data.pushAllData(array)
// const array=colors1 //方法3---导入别的页面的数据
// this.data.pushAllData(array)
}
build() {
Column() {
//----------------
List({ space: 3 }) {
LazyForEach(this.data, (item: string, index: number) => {
ListItem() {
Row() {
Text(item)
.fontSize(50)
.onClick(() => {
AlertDialog.show({
message: 'Index:' + index.toString() + ' item:' + item
})
})
}
}
}, (item: string) => item)
}.cachedCount(5) //缓存 源码来自 wb86.com
//----------------
}
}
}来源:济亨网
本文链接:https://wb98.com/post/390.html