HarmonyOS notifyDataAdd失效问题

请看如下代码,加载数据后,点击顶部增加元素,调用 this.dataSource.addFirstItem() 后,列表并没有加元素。请帮忙看下是系统api的bug还是使用的问题。

@Entry 
@Component 
struct ListExample { 
 
  private listScroller: Scroller = new Scroller(); 
  @State num:number = 9 
  dataSource: WaterFlowDataSource = new WaterFlowDataSource() 
 
  aboutToAppear(): void { 
    setTimeout(()=>{ 
      let dataArray: MessageData[] =[] 
      for (let i = 0; i < 20; i++) { 
         dataArray.push(new MessageData("1","ha")) 
      } 
      this.dataSource.addDataArray(dataArray) 
      //this.listScroller.scrollEdge(Edge.Bottom) 
    },2000) 
  } 
 
  build() { 
    Column() { 
      Button('顶部增加数据') 
        .onClick(() => { 
          console.info('dataCode' + this.num) 
          this.num++ 
 
         this.dataSource.addFirstItem() 
        }) 
      List({ space: 20, initialIndex: 9,scroller: this.listScroller }) { 
        LazyForEach(this.dataSource, (item: MessageData,index:number) => { 
          ListItem() { 
            Row(){ 
              Image($r('app.media.app_icon')).width(20) 
              Text('哈哈 ' + item.text + " " + item.pic + " index="+index) 
                .width('100%').height(100).fontSize(16) 
                .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF) 
            } 
          } 
        }, (item: string) => item) 
      }.onReachStart(()=>{ 
        setTimeout(()=>{ 
          this.dataSource.addData(0,new MessageData('top','顶部元素')) 
        },500) 
 
      }) 
      .listDirection(Axis.Vertical) // 排列方向 
      .scrollBar(BarState.Off) 
      .friction(0.6) 
      .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线 
      .edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring 
      .onScrollIndex((firstIndex: number, lastIndex: number, centerIndex: number) => { 
        //this.listScroller.scrollToIndex(lastIndex) 
      }) 
      .width('90%') 
      .layoutWeight(1) 
    } 
    .width('100%') 
    .height('100%') 
    .backgroundColor(0xDCDCDC) 
    .padding({ top: 5 }) 
  } 
} 
 
 
export class WaterFlowDataSource implements IDataSource { 
  private dataArray: MessageData[] = [] 
  private listeners: DataChangeListener[] = [] 
 
  constructor() { 
     for (let i = 0; i < 20; i++) { 
       this.dataArray.push(i) 
     } 
  } 
 
  public addDataArray(dataArray:MessageData[]){ 
    this.dataArray = dataArray 
    this.notifyDataReload() 
  } 
 
  // 获取索引对应的数据 
  public getData(index: number) { 
    return this.dataArray[index] 
  } 
 
  // 通知控制器数据增加 
  notifyDataAdd(index: number): void { 
    this.listeners.forEach(listener => { 
      listener.onDataAdd(index) 
    }) 
  } 
 
  // 获取数据总数 
  public totalCount(): number { 
    return this.dataArray.length 
  } 
 
  // 注册改变数据的控制器 
  registerDataChangeListener(listener: DataChangeListener): void { 
    if (this.listeners.indexOf(listener) < 0) { 
      this.listeners.push(listener) 
    } 
  } 
 
  // 注销改变数据的控制器 
  unregisterDataChangeListener(listener: DataChangeListener): void { 
    const pos = this.listeners.indexOf(listener) 
    if (pos >= 0) { 
      this.listeners.splice(pos, 1) 
    } 
  } 
 
  public insertArrayAt(arr1:MessageData[],index:number,arr2:MessageData[]) { 
    arr1.splice(index,0,...arr2) 
    return arr1 
  } 
 
  // 在数据尾部增加元素 
 
  public addFirstItem(): void { 
    this.dataArray.unshift(new MessageData("0","顶部元素")) 
    this.notifyDataAdd(0) 
  } 
 
  public addData(index: number, data: MessageData): void { 
    this.dataArray.splice(index, 0, data); 
    this.notifyDataAdd(index); 
  } 
 
  notifyDataReload(): void { 
    this.listeners.forEach(listener => { 
      listener.onDataReloaded(); 
    }) 
  } 
} 
 
@Observed 
class MessageData{ 
  text?:string 
  pic:string|undefined 
 
  constructor(text: string, pic: string | undefined) { 
    this.text = text; 
    this.pic = pic; 
  } 
 
}
HarmonyOS
2024-08-30 09:31:24
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

是keyGenerator中keyGenerator设置的问题,在操作数据的增删改的情况下要保证keyGenerator的值不能重复,请把如下代码替换下试试

LazyForEach(this.dataSource, (item: MessageData,index:number) => { 
 ListItem() { 
  Row(){ 
   Image($r('app.media.app_icon')).width(20) 
   Text('哈哈 ' + item.text + " " + item.pic + " index="+index) 
    .width('100%').height(100).fontSize(16) 
    .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF) 
  } 
 } 
},(item: MessageData,index:number) => `${JSON.stringify(item)}-${index}`)  //(item: string) => item)
分享
微博
QQ
微信
回复
2024-08-30 17:56:35
相关问题
HarmonyOS后台播放失效问题
527浏览 • 1回复 待解决
HarmonyOS auto失效
63浏览 • 1回复 待解决
HarmonyOS instanceof判断失效
42浏览 • 1回复 待解决
HarmonyOS webView缓存失效
18浏览 • 1回复 待解决
HarmonyOS 设置userAgent失效
26浏览 • 1回复 待解决
HarmonyOS WebView 圆角设置失效
129浏览 • 1回复 待解决
HarmonyOS 卡片点击事件失效
22浏览 • 1回复 待解决
HarmonyOS 网络变化监听失效
53浏览 • 1回复 待解决
HarmonyOS Span的属性设置失效
22浏览 • 1回复 待解决
HarmonyOS 安全区域失效
36浏览 • 1回复 待解决
HarmonyOS 首选项回调失效
19浏览 • 1回复 待解决
RelativeContainer布局嵌套Stack失效
407浏览 • 1回复 待解决
HarmonyOS Web 图片上传功能失效
258浏览 • 1回复 待解决
span组件使用margin属性失效
2052浏览 • 1回复 待解决
HarmonyOS升级版本后音量监听失效
573浏览 • 0回复 待解决