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 LazyForEach修改数据源不刷新问题
169浏览 • 1回复 待解决
HarmonyOS 解析Json数据添加到数据源不刷新UI
450浏览 • 2回复 待解决
关于使用foreach&lazyforeach更改数据源界面不刷新的问题
888浏览 • 2回复 待解决
HarmonyOS IDataSource支持数据源整体一次替换
473浏览 • 1回复 待解决
HarmonyOS使用@ObjectLink 数据不刷新
583浏览 • 2回复 待解决
异步回调更新数据源,无法触发列表渲染
2592浏览 • 2回复 待解决
如何解决使用foreach&lazyforeach循环渲染时,会出现更改数据源时,界面不刷新的问题
667浏览 • 1回复 待解决
列表数组中插入数据后,刷新UI的问题
252浏览 • 1回复 待解决
IF条件变化后UI不刷新
651浏览 • 1回复 待解决
使用foreach&lazyforeach循环渲染时,会出现更改数据源时,界面不刷新的情况。如何解决
2146浏览 • 1回复 待解决
HarmonyOS 局部刷新,网络请求回数据后,刷新某个值
383浏览 • 1回复 待解决
HarmonyOS 列表刷新问题
472浏览 • 1回复 待解决
lazyforeach替换数据源解决方案
614浏览 • 1回复 待解决
修改ForEach使用的数据对象,UI不刷新
1463浏览 • 1回复 待解决
HarmonyOS 有一个页面,有多层@Component组件,现在修改数据后页面不刷新
180浏览 • 1回复 待解决
刷新列表加载更多问题
240浏览 • 1回复 待解决
Foreach循环渲染,数据源改变时的重复渲染
879浏览 • 1回复 待解决
当网络请求的数据源对象的内容发生变更后,所有图片都会一闪而过;如果数据源的内容没变,就不会发生
264浏览 • 1回复 待解决
HarmonyOS 刷新列表中的某个ITEM,会导致整个ITEM都刷新,有单独刷新某个控件的办法吗?
297浏览 • 1回复 待解决
HarmonyOS 下面demo为什么点击不刷新?
254浏览 • 1回复 待解决
列表局部刷新,有人知道怎么处理吗?
698浏览 • 1回复 待解决
HarmonyOS 状态变量不刷新问题
331浏览 • 1回复 待解决
WebView下沉C++,执行runJavaScript后页面不刷新,疑似有报错
1874浏览 • 1回复 待解决
状态装饰器 ui不刷新的问题
2357浏览 • 1回复 待解决
HarmonyOS 如何在详情中改变了某个状态,通知到列表页刷新数据?
152浏览 • 1回复 待解决
参考demo: