HarmonyOS IDataSource数据源刷新后,列表为不刷新
一个列表,里面有Text和一个CheckBox, 当点击一个item中的Text时,具有相同Text内容的都属于选择状态, 下拉刷新后(点击顶部刷新文字), 应具有相同的交互。 但是目前测试结果是数据刷新后点击无效。代码如下:
import { BasicDataSource } from '../BasicDataSource';
import { MediaModel } from '../MediaModel';
import { promptAction } from '@kit.ArkUI';
@Component
struct ItemView {
@ObjectLink model: MediaModel
clickCallback: ((model: MediaModel) => void) | null = null
build() {
Row() {
Text(this.model.name)
.fontColor(Color.White)
.onClick(() => {
this.clickCallback && this.clickCallback(this.model)
})
.textAlign(TextAlign.Center)
.width(60)
.height(48)
.backgroundColor(Color.Red)
Checkbox().select(this.model.isConcern)
}.height(64)
}
}
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
@State dataSource: BasicDataSource<MediaModel> = new BasicDataSource()
concernList: MediaModel[] = []
aboutToAppear(): void {
this.refreshData()
}
build() {
Row() {
Column() {
Text('刷新')
.fontSize(16)
.fontWeight(FontWeight.Bold).onClick(() => {
this.refreshData()
promptAction.showToast({ message: '刷新完成' })
})
List() {
LazyForEach(this.dataSource, (item: MediaModel) => {
ListItem() {
ItemView({
model: item, clickCallback: (model: MediaModel) => {
this.addConcern(model)
}
})
}
})
}
}
.width('100%').justifyContent(FlexAlign.Start)
}
.height('100%').alignItems(VerticalAlign.Top)
}
private refreshData() {
this.dataSource.clear()
this.dataSource.pushData(new MediaModel('ABC'))
this.dataSource.pushData(new MediaModel('ABC'))
this.dataSource.pushData(new MediaModel('DEF'))
this.dataSource.pushData(new MediaModel('ABC'))
this.dataSource.pushData(new MediaModel('LMN'))
this.dataSource.pushData(new MediaModel('XYZ'))
this.dataSource.pushData(new MediaModel('XYZ'))
this.dataSource.pushData(new MediaModel('ABC'))
this.dataSource.pushData(new MediaModel('XYZ'))
this.dataSource.pushData(new MediaModel('XYZ'))
this.dataSource.pushData(new MediaModel('XYZ'))
this.dataSource.pushData(new MediaModel('LMN'))
this.dataSource.pushData(new MediaModel('LMN'))
this.dataSource.pushData(new MediaModel('LMN'))
}
private addConcern(media: MediaModel) {
if (this.concernList.findIndex((value) => value.name == media.name) == -1) {
this.concernList.push(media)
}
this.filterConcern()
}
private filterConcern() {
for (let i = 0; i < this.dataSource.totalCount(); i++) {
const item = this.dataSource.getData(i)
item.isConcern = this.concernList.findIndex((value) => value.name == item.name) != -1
}
console.error('aaa', 'aaa')
}
}
export class BasicDataSource <T> implements IDataSource {
private listeners: DataChangeListener[] = [];
private originDataArray: T[] = [];
public totalCount(): number {
return this.originDataArray.length;
}
public pushData(data: T): void {
this.originDataArray.push(data);
this.notifyDataAdd(this.originDataArray.length - 1);
}
public clear():void{
this.originDataArray.splice(0, this.originDataArray.length)
this.notifyDataReload()
}
public getData(index: number): T {
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);
})
}
}
@Observed
export class MediaModel {
name: string = ''
isConcern: boolean = false
constructor(name: string) {
this.name = name
}
}
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
HarmonyOS 解析Json数据添加到数据源不刷新UI
597浏览 • 2回复 待解决
HarmonyOS LazyForEach修改数据源不刷新问题
630浏览 • 1回复 待解决
HarmonyOS IDataSource支持数据源整体一次替换
667浏览 • 1回复 待解决
关于使用foreach&lazyforeach更改数据源界面不刷新的问题
1185浏览 • 2回复 待解决
HarmonyOS Tabs展示完毕后,修改数据源后,Tabs内容无法刷新,请问如何处理
54浏览 • 1回复 待解决
HarmonyOS TextPickerDialog数据源更新,UI不更新
24浏览 • 1回复 待解决
异步回调更新数据源,无法触发列表渲染
2811浏览 • 2回复 待解决
如何解决使用foreach&lazyforeach循环渲染时,会出现更改数据源时,界面不刷新的问题
919浏览 • 1回复 待解决
列表数组中插入数据后,刷新UI的问题
371浏览 • 1回复 待解决
HarmonyOS使用@ObjectLink 数据不刷新
798浏览 • 2回复 待解决
使用foreach&lazyforeach循环渲染时,会出现更改数据源时,界面不刷新的情况。如何解决
2420浏览 • 1回复 待解决
IF条件变化后UI不刷新
783浏览 • 1回复 待解决
HarmonyOS 根据列表的title,刷新列表的数据
78浏览 • 1回复 待解决
HarmonyOS 使用LazyForEach,数据源传不进来,UI不更新
29浏览 • 1回复 待解决
lazyforeach替换数据源解决方案
740浏览 • 1回复 待解决
HarmonyOS 深色模式切换后界面不刷新
36浏览 • 1回复 待解决
HarmonyOS 局部刷新,网络请求回数据后,刷新某个值
645浏览 • 1回复 待解决
HarmonyOS 懒加载列表更改属性UI不刷新
37浏览 • 1回复 待解决
HarmonyOS 列表刷新问题
659浏览 • 1回复 待解决
HarmonyOS UI不刷新
30浏览 • 1回复 待解决
HarmonyOS 通知列表刷新事件
75浏览 • 1回复 待解决
HarmonyOS ForEach列表刷新问题
79浏览 • 1回复 待解决
HarmonyOS picker选择器的数据源问题
0浏览 • 0回复 待解决
修改ForEach使用的数据对象,UI不刷新
1875浏览 • 1回复 待解决
HarmonyOS 子组件隐藏后显示,局部刷新数据
0浏览 • 0回复 待解决
参考demo: