HarmonyOS 鸿蒙Next List组件ForEach中无法正确删除元素

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

HarmonyOS 鸿蒙Next List组件ForEach中无法正确删除元素

操作步骤:

8 回复

key不能用index,换成item就好了cke_345.png

更多关于HarmonyOS 鸿蒙Next List组件ForEach中无法正确删除元素的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


语法冲突还是固定写法?

**描述:** 这是一个测试

**标签:** 测试标签

![图片](https://example.com/image.png)
字段名 数据类型 长度 是否必填 描述
id int 11 用户ID
name varchar 255 姓名
created_at datetime 创建时间
updated_at datetime 更新时间

姓名

张三

职位

软件工程师

手机号码

123-456-7890

电子邮箱

zhangsan@example.com

地址

北京市朝阳区

class BasicDataSource implements IDataSource { private listeners: DataChangeListener[] = []; private originDataArray: string[] = [];

public totalCount(): number { return 0; }

public getData(index: number): string { return this.originDataArray[index]; }

registerDataChangeListener(listener: DataChangeListener): void { if (this.listeners.indexOf(listener) < 0) { console.info(‘add listener’); this.listeners.push(listener); } }

unregisterDataChangeListener(listener: DataChangeListener): void { const pos = this.listeners.indexOf(listener); if (pos >= 0) { console.info(‘remove listener’); this.listeners.splice(pos, 1); } }

notifyDataReload(): void { this.listeners.forEach(listener => { listener.onDataReloaded(); }) }

notifyDataAdd(index: number): void { this.listeners.forEach(listener => { listener.onDataAdd(index); }) }

notifyDataChange(index: number): void { this.listeners.forEach(listener => { listener.onDataChange(index); }) }

notifyDataDelete(index: number): void { this.listeners.forEach(listener => { listener.onDataDelete(index); }) }

notifyDataMove(from: number, to: number): void { this.listeners.forEach(listener => { listener.onDataMove(from, to); }) } }

class MyDataSource extends BasicDataSource { dataArray: string[] = [];

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

public getData(index: number): string { return this.dataArray[index]; }

public addData(index: number, data: string): void { this.dataArray.splice(index, 0, data); this.notifyDataAdd(index); }

// 在数据尾部增加一个元素 public AddLastItem(): void { this.dataArray.splice(this.dataArray.length, 0, this.dataArray.length.toString()) this.notifyDataAdd(this.dataArray.length - 1) }

public pushData(data: string): void { this.dataArray.push(data); this.notifyDataAdd(this.dataArray.length - 1); }

public deleteData(index: number): void { this.dataArray.splice(index, 1); this.notifyDataDelete(index); } }

@Entry @Component struct ListEdit { private data: MyDataSource = new MyDataSource(); @State transitionTime: TransitionEffect = (TransitionEffect.IDENTITY)

setDeleteAnimation() { this.transitionTime = (TransitionEffect.opacity(0) .animation({ duration: 300, })).combine(TransitionEffect.asymmetric(TransitionEffect.move(TransitionEdge.END), TransitionEffect.move(TransitionEdge.START))) }

setAddAnimation() { this.transitionTime = (TransitionEffect.opacity(0) .animation({ duration: 300, delay:500 })).combine(TransitionEffect.asymmetric(TransitionEffect.move(TransitionEdge.END), TransitionEffect.move(TransitionEdge.START))) }

aboutToAppear() { for (let i = 0; i <= 20; i++) { this.data.pushData(${i}) } }

@State index2: number = 100

build() { List({ space: 3 }) { LazyForEach(this.data, (item: string, index: number) => { ListItem() { Row() { Text(item) .fontSize(50) .width(‘70%’) .height(80) .fontSize(20) .textAlign(TextAlign.Center) .borderRadius(10) .border({ width: 1 }) Button(‘del’) .onClick(() => { this.setDeleteAnimation() animateTo({ duration: 800,delay:300, curve: Curve.Linear,onFinish: () => { this.transitionTime=(TransitionEffect.IDENTITY) //动画结束时设置禁止转场 } }, () => { this.data.deleteData(this.data.dataArray.indexOf(item)) }) }) Button(‘add’) .onClick(() => { this.setAddAnimation() // 点击添加数据 this.index2 = this.index2 + 1 animateTo({ duration: 500, curve: Curve.Smooth,onFinish: () => { this.transitionTime=(TransitionEffect.IDENTITY) } }, () => { this.data.addData(0, “new Data” + this.index2) }) }) } .margin({ left: 10, right: 10 }) } .transition( this.transitionTime) .swipeAction({ end: { onAction: () => { this.setDeleteAnimation() animateTo({ duration: 1000 }, () => { this.data.deleteData(this.data.dataArray.indexOf(item)) }) }, actionAreaDistance: 56, onEnterActionArea: () => {}, onExitActionArea: () => {} } }) .onAppear(() => { console.info(‘cbl’ + item) // 即将触底时提前增加数据 if (item + 1 == this.data.totalCount().toString()) { for (let i = 0; i < 10; i++) { this.data.AddLastItem() } } }) }, (item: string) => item) }.cachedCount(5) } }

希望HarmonyOS能继续加强在安全性方面的研发,保护用户的隐私和数据安全。

在HarmonyOS鸿蒙系统中,针对Next List组件的ForEach中无法正确删除元素的问题,这通常是由于ForEach的遍历机制导致的。ForEach是一个用于遍历集合的视图构建器,它并不直接支持元素的删除操作,因为它主要是为展示数据而设计的。

在鸿蒙系统的UI框架中,如果你需要在遍历过程中删除元素,建议采用以下方式:

  1. 使用可观察的数据模型:确保你的数据源(如List或ArrayList)是可观察的,并且能够在数据变化时通知UI进行更新。

  2. 手动管理数据删除:在ForEach外部,通过调用数据源的方法来删除元素,并触发UI的重新渲染。例如,你可以使用一个按钮或其他交互元素来触发删除操作,然后在删除后调用数据源的notifyDataSetChanged()或类似方法来刷新UI。

  3. 使用其他组件或方法:如果ForEach不满足你的需求,可以考虑使用其他组件或方法来管理列表的显示和删除操作,如使用ListView或RecyclerView等更灵活的组件。

请注意,上述方法可能需要根据你的具体应用场景进行调整。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部