HarmonyOS waterflow组件同时删除多个item问题

同时删除多个数据后,重新调用setRefreshData设置源数据,这样设置界面不会刷新,难道需要多次调用notifyDataDelete?

public setRefreshData(data: Array<object>): void {  
    this.dataArray = []  
    this.dataArray = data  
    this.notifyDataReload()  
  }
HarmonyOS
2024-10-25 11:41:06
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

参考一下文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-waterflow-V5#示例1

参考demo模拟你的数据增减需求。您看看是否满足要求。

WaterFlowDataSource.ets

export class WaterFlowDataSource<T> implements IDataSource {  
  private dataArray: T[] = [];  
  private listeners: DataChangeListener[] = [];  
  
  constructor(element: T[]) {  
    this.dataArray = element;  
  }  
  
  //设置数据  
  public setDataArray(productDataArray: T[]): void {  
    this.dataArray = productDataArray;  
  }  
  
  //获取数据总数  
  public totalCount(): number {  
    return this.dataArray.length;  
  }  
  
  // 获取索引对应的数据  
  public getData(index: number) {  
    return this.dataArray[index];  
  }  
  
  // 注册改变数据的控制器  
  registerDataChangeListener(listener: DataChangeListener): void {  
    if (this.listeners.indexOf(listener) < 0) {  
      this.listeners.push(listener);  
    }  
  }  
  
  // 注销改变数据的控制器  
  unregisterDataChangeListener(listener: DataChangeListener): void {  
    let pos = this.listeners.indexOf(listener);  
    if (pos >= 0) {  
      this.listeners.splice(pos, 1);  
    }  
  }  
  
  // 通知控制器数据增加  
  notifyDataAdd(index: number): void {  
    this.listeners.forEach(listener => {  
      listener.onDataAdd(index)  
    })  
  }  
  
  // 通知控制器数据变化  
  notifyDataChange(index: number): void {  
    this.listeners.forEach(listener => {  
      listener.onDataChange(index)  
    })  
  }  
  
  // 增加数据  
  public Add1stItem(data:T): void {  
    this.dataArray.splice(0, 0, data)  
    this.notifyDataAdd(0)  
  }  
  
  // 在数据尾部增加一个元素  
  public AddLastItem(data:T): void {  
    this.dataArray.splice(this.dataArray.length, 0,data)  
    this.notifyDataAdd(this.dataArray.length - 1)  
  }  
  
  // 删除第一个元素  
  public Delete1stItem(): void {  
    this.dataArray.splice(0, 1)  
    this.notifyDataDelete(0)  
  }  
  
  // 删除第n个元素  
  public DeleteItemWithIndex(index:number): void {  
    this.dataArray.splice(index, 1)  
    this.notifyDataDelete(index)  
  }  
  
  // 删除一组元素  
  public DeleteItemWithArr(indexArr:number[]): void {  
    for(let i=0; i< indexArr.length; i++){  
      this.dataArray.splice(indexArr[i], 1)  
      this.notifyDataDelete(indexArr[i])  
    }  
  
  }  
  
  // 删除最后一个元素  
  public DeleteLastItem(): void {  
    this.dataArray.splice(-1, 1)  
    this.notifyDataDelete(this.dataArray.length)  
  }  
  
  // 通知控制器数据删除  
  notifyDataDelete(index: number): void {  
    this.listeners.forEach(listener => {  
      listener.onDataDelete(index)  
    })  
  }  
  
  // 重新加载数据  
  public Reload(): void {  
    this.dataArray.splice(1, 1)  
    this.dataArray.splice(3, 2)  
    this.notifyDataReload()  
  }  
  
  // 通知控制器数据重新加载  
  notifyDataReload(): void {  
    this.listeners.forEach(listener => {  
      listener.onDataReloaded()  
    })  
  }  
}

下面是Index.ets

import { WaterFlowDataSource } from '../viewmodel/WaterFlowDataSource';  
  
class Data {  
  image:string = ''  
  textStr:string = ''  
  constructor(textStr: string,image:string) {  
    this.textStr = textStr;  
    this.image = image;  
  }  
}  
@Entry  
@Component  
export default struct Index {  
  @State texDataList:Data[] = [];  
  selectedDataList:number[] = [];  
  datasource: WaterFlowDataSource<Data> = new WaterFlowDataSource([])  
  
  aboutToAppear(): void {  
    //模拟网路数据加载  
    let tempStr :string[] = ['11asadwqe','22asdadasdasd','33qweqw','44asqweqweqweqweqw','55s','66qweqeqeqeqweqweqeq','77','88','99jhkjsdkjhadqweqekjahskjdhahda']  
    for (let i = 0; i < tempStr.length; i ++) {  
      let dataTemp = new Data(tempStr[i],'app.media.startIcon')  
      this.texDataList.push(dataTemp);  
    }  
    this.datasource = new WaterFlowDataSource(this.texDataList)  
  }  
  
  //模拟选择两个数据,  
  setSelectedData(){  
    this.selectedDataList.push(0)  
    this.selectedDataList.push(2)  
  }  
  
  deleteSelectedData(data:Array<number>){  
    this.datasource.DeleteItemWithArr(data)  
  }  
  
  build() {  
    Column(){  
      Row(){  
        Button('增加数据')  
          .onClick(()=>{  
            let dataTemp = new Data('增加数据'+this.datasource.totalCount().toString(),'app.media.startIcon')  
            this.datasource.Add1stItem(dataTemp);  
          })  
        Button('减少数据')  
          .onClick(()=>{  
            //this.datasource.Delete1stItem()  
            this.setSelectedData()  
            this.deleteSelectedData(this.selectedDataList)  
  
          })  
      }  
      .width('94%')  
      .height(200)  
      .justifyContent(FlexAlign.SpaceEvenly)  
  
      if (this.texDataList.length > 0) {  
        WaterFlow({ footer: (): void => this.itemFoot() }) {  
  
          LazyForEach(this.datasource, (item: Data) => {  
            FlowItem() {  
              FlowItemComponent({ item: item })  
                .onClick(()=>{  
  
                })  
            }  
          }, (item: Data) => JSON.stringify(item))  
        }  
        .margin({left:10,right:10})  
        .layoutWeight(1)  
        .layoutDirection(FlexDirection.Column)  
        .columnsTemplate('1fr 1fr')  
        .columnsGap('8vp')  
        .rowsGap('8vp')  
      }  
    }  
    .backgroundColor('#f1f1f1')  
    .width('100%')  
    .height('100%')  
  }  
  
  @Builder  
  itemFoot() {  
    Column() {  
      Text('已经到底啦')  
        .fontColor(Color.Gray)  
        .fontSize('10vp')  
        .width('100%')  
        .height('20vp')  
        .textAlign(TextAlign.Center)  
    }  
  }  
}  
  
@Component  
struct FlowItemComponent{  
  item:Data = new Data('','')  
  build() {  
    Column() {  
      Image($r(this.item?.image))  
        .width('130vp')  
        .height('130vp')  
        .objectFit(ImageFit.Contain)  
        .margin({  
          top: '12vp',  
          bottom: '12vp'  
        })  
      Text(this.item.textStr)  
        .fontColor(Color.Blue)  
        .fontSize('14vp')  
        .width('100%')  
        .textAlign(TextAlign.Center)  
    }  
    .borderRadius('8vp')  
    .backgroundColor(Color.White)  
    .padding({  
      left: '12vp',  
      right: '12vp',  
      bottom: '12vp'  
    })  
  }  
}
分享
微博
QQ
微信
回复
2024-10-25 15:15:02
相关问题
HarmonyOS WaterFlow嵌套问题
42浏览 • 1回复 待解决
HarmonyOS List组件WaterFlow组件增强
601浏览 • 1回复 待解决
是否可以同时启动多个编码器
2047浏览 • 1回复 待解决
HarmonyOS List item 刷新问题
799浏览 • 1回复 待解决
Mysql 同时修改多个库的数据怎么弄?
2894浏览 • 1回复 待解决
HarmonyOS导出多个问题
454浏览 • 1回复 待解决
HarmonyOS grid里面的item支持拖动问题
48浏览 • 1回复 待解决
HarmonyOS 懒加载的数据删除问题
481浏览 • 1回复 待解决
HarmonyOS 多个@Prop变化顺序问题
292浏览 • 1回复 待解决
关于Grid容器和WaterFlow使用上的问题
903浏览 • 1回复 待解决