HarmonyOS LazyForEach无法检测数据源的变化进行重新渲染
假设源数据源为:ABABAABB
现在需要过滤单独为A或B进行展示,需要更换数据源
已经更换了数据源,并调用了notifyDataReload方法,但是页面上LazyForEach中数据依旧不更新。
代码处理流程
1.实现IDataSource接口
export class CommonDataSource<T> implements IDataSource {
private dataArray: T[] = [];
private listeners: DataChangeListener[] = [];
constructor(element: T[]) {
this.dataArray = element;
}
public getData(index: number) {
return this.dataArray[index]
}
public totalCount(): number {
return this.dataArray.length;
}
public addData(index: number, data: T[]): void {
this.dataArray = this.dataArray.concat(data);
this.notifyDataAdd(index);
}
public pushData(data: T): void {
this.dataArray.push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
unregisterDataChangeListener(listener: DataChangeListener): void {
const pos = this.listeners.indexOf(listener);
if (pos >= 0) {
this.listeners.splice(pos, 1);
}
}
registerDataChangeListener(listener: DataChangeListener): void {
if (this.listeners.indexOf(listener) < 0) {
this.listeners.push(listener);
}
}
notifyDataReload(): void {
this.listeners.forEach((listener: DataChangeListener) => {
listener.onDataReloaded();
})
}
notifyDataAdd(index: number): void {
this.listeners.forEach((listener: DataChangeListener) => {
listener.onDataAdd(index);
})
}
notifyDataChange(index: number): void {
this.listeners.forEach((listener: DataChangeListener) => {
listener.onDataChange(index);
})
}
notifyDataDelete(index: number): void {
this.listeners.forEach((listener: DataChangeListener) => {
listener.onDataDelete(index);
})
}
notifyDataMove(from: number, to: number): void {
this.listeners.forEach((listener: DataChangeListener) => {
listener.onDataMove(from, to);
})
}
modifyAllData(element: T[]): void{
this.dataArray = element
this.notifyDataReload()
}
}
2.定义数据源数据
@State messages: Array<Message> = []
@State filterMessages: Array<Message> = []
@Watch('onFilterIndexChange')@State filterIndex: number = 0; // 用来监听选择的条件,比如0表示全选,1表示筛选A 2表示筛选B
3.源数据源列表展示
List({ space: 10 }) {
LazyForEach(this.data, (item: Message) => {
ListItem() {
this.MessageItem(item)
}
})
}
.scrollBar(BarState.Off)
.cachedCount(4)
@Builder
MessageItem(item: Message) {}
4.更换数据源
onFilterIndexChange(){
// AlertDialog.show({message: `${this.filterIndex}`})
if (this.filterIndex === 0) {
this.data?.modifyAllData(this.messages)
}else if(this.filterIndex === 1){
this.filterMessages = this.messages.filter((message : Message) => message.type === MessageType.HumanoidDetection)
this.data?.modifyAllData(this.filterMessages)
}else {
this.filterMessages = this.messages.filter((message : Message) => message.type === MessageType.MotionDetection)
this.data?.modifyAllData(this.filterMessages)
}
}
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
lazyforeach替换数据源解决方案
740浏览 • 1回复 待解决
异步回调更新数据源,无法触发列表渲染
2811浏览 • 2回复 待解决
Foreach循环渲染,数据源改变时的重复渲染
1044浏览 • 1回复 待解决
HarmonyOS Swiper使用LazyForEach,在数据源更新后,页面闪烁
4浏览 • 0回复 待解决
HarmonyOS LazyForEach修改数据源不刷新问题
632浏览 • 1回复 待解决
HarmonyOS 使用LazyForEach,数据源传不进来,UI不更新
29浏览 • 1回复 待解决
如何解决使用foreach&lazyforeach循环渲染时,会出现更改数据源时,界面不刷新的问题
919浏览 • 1回复 待解决
关于使用foreach&lazyforeach更改数据源界面不刷新的问题
1185浏览 • 2回复 待解决
HarmonyOS 数组修改item对象的某个值,notifyDataReload无法重新渲染LazyForEach
36浏览 • 1回复 待解决
使用foreach&lazyforeach循环渲染时,会出现更改数据源时,界面不刷新的情况。如何解决
2420浏览 • 1回复 待解决
HarmonyOS picker选择器的数据源问题
4浏览 • 0回复 待解决
HarmonyOS TextPickerDialog数据源更新,UI不更新
24浏览 • 1回复 待解决
HarmonyOS IDataSource支持数据源整体一次替换
667浏览 • 1回复 待解决
HarmonyOS IDataSource数据源刷新后,列表为不刷新
375浏览 • 1回复 待解决
HarmonyOS 解析Json数据添加到数据源不刷新UI
598浏览 • 2回复 待解决
HarmonyOS TextPicker多列选择器数据源的构造问题
1浏览 • 0回复 待解决
HarmonyOS ForEach、LazyForEach重新渲染item的时候,item里的图片会闪动
0浏览 • 0回复 待解决
HarmonyOS Photo Picker组件数据源赋值问题咨询
26浏览 • 1回复 待解决
MVVM设计模式中的ViewModel的顶层数据源是如何与低层数据进行同步的?
505浏览 • 1回复 待解决
HarmonyOS list中传入一个sendable属性的数组,数据源变化时,里面的item一直在重新创建,有啥办法避免吗?
288浏览 • 1回复 待解决
HarmonyOS Tabs展示完毕后,修改数据源后,Tabs内容无法刷新,请问如何处理
54浏览 • 1回复 待解决
HarmonyOS 自定义组件,数据更新时,界面无法重新渲染
52浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何管理HarmonyOS NEXT中轮播图的数据源?
134浏览 • 1回复 待解决
当网络请求的数据源对象的内容发生变更后,所有图片都会一闪而过;如果数据源的内容没变,就不会发生
411浏览 • 1回复 待解决
HarmonyOS lazyforEach渲染问题
48浏览 • 1回复 待解决
LazyforEach生成键值的方式与ForEach不同。
LazyforEach生成键值的方式根据文档的内容,可知如果修改了数据源,需要手动修改键值生成方式