《鸿蒙开发-答案之书》懒加载BaseDataSource封装

《鸿蒙开发-答案之书》懒加载BaseDataSource封装

List的懒加载很常见,还有Swiper的。用懒加载可以提供性能。

下面分享一个封装好的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)
    }
  }
}

上面代码可以直接拿去用

有鸿蒙开发bug或者需求的可私信我,我每天都看私信的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值