《鸿蒙第一行代码》第五课 List懒加载的基类BaseDataSource

87 阅读1分钟
《鸿蒙第一行代码》第五课 List懒加载的基类BaseDataSource

这个基类网上还不好找,已经被我用在项目中了。很好用

直接上代码:

export class BaseDataSource<T> implements IDataSource{

  private listeners: DataChangeListener[] = []
  private dataArray:T[] = []

  // 设置新数据
  setNewData(data: T[]){
    this.dataArray = data
    this.notifyDataReload()
  }

  // 添加数据;index:添加的位置,不传就添加在最后
  addData(data: T[], position?: number){
    if(typeof position === 'number' && position < this.totalCount()){
      // 不是添加在末尾就刷新全列表,要不列表上的位置index变量是不会更新的
      this.dataArray.splice(position, 0, ...data)
      this.notifyDataReload()
    }else {
      let index: number = this.totalCount()
      data.forEach((item:T,i: number) =>{
        this.dataArray.splice(index + i, 0, item)
        this.listeners.forEach(listener => {
          listener.onDataAdd(index + i);
        })
      })
    }
  }

  addDataNoListener(data: T){
    this.dataArray.push(data)
  }

  // 删除数据;index:删除的位置
  // deleteCount:连续删除接下来的几位,不传就只删除一位,超出最大数就从index位删到末尾
  deleteData(index: number, deleteCount?: number){
    if(index < this.totalCount()){
      if(typeof deleteCount !== 'number'){
        deleteCount = 1
      }else if(deleteCount > this.totalCount() - index){
        deleteCount = this.totalCount() - index
      }
      for(let i = 0; i < deleteCount; i++){
        this.dataArray.splice(index, 1)
        // this.listeners.forEach(listener => {
        //   listener.onDataDelete(index);
        // })
      }
      this.notifyDataReload()
    }
  }

  // 更新某一位的数据;index:刷新的位置; item:新数据
  changeData(index: number, item: T){
    if(index < this.totalCount()){
      this.dataArray.splice(index, 1, item)
      this.listeners.forEach(listener => {
        listener.onDataChange(index);
      })
    }
  }

  // 刷新所有子组件
  notifyDataReload(): void {
    this.listeners.forEach(listener => {
      listener.onDataReloaded();
    })
  }

  // 通知控制器数据变化
  notifyDataChange(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataChange(index)
    })
  }

  totalCount(): number {
    return this.dataArray.length
  }

  getData(index: number):T {
    return this.dataArray[index]
  }

  getAllData():T[] {
    return this.dataArray
  }

  resetAllDataNoListener() {
    this.dataArray = []
  }

  // 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
  registerDataChangeListener(listener: DataChangeListener): void {
    if (this.listeners.indexOf(listener) < 0) {
      this.listeners.push(listener)
    }
  }

  // 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
  unregisterDataChangeListener(listener: DataChangeListener): void {
    const pos = this.listeners.indexOf(listener)
    if (pos >= 0) {
      this.listeners.splice(pos, 1)
    }
  }
}

拿过去直接用。

《鸿蒙第一行代码》项目代码结构图:

在这里插入图片描述
有需要《鸿蒙第一行代码》项目源码的私信我,我每天都看私信的