请教下GList虚拟列表里面异步更新item的问题.
虚拟列表的性能和itemRenderer的处理逻辑密切相关,你应该尽量简化这里面的逻辑,协程、IO、高密度计算这类操作不应该在这里出现,否则会出现卡顿。如果需要在itemRenderer里发起异步操作,切勿让异步操作保存ITEM实例,并且在回调中直接修改ITEM实例,正确的做法是让异步操作保存ITEM的索引,异步操作完成后,查询这个索引的ITEM是否有对应的显示对象,有则更新,如果没有,放弃更新。
另外,itemRenderer里也不应该有new等会产生GC的操作,因为在滚动的过程中,itemRenderer调用的频率会非常高。
根据教程说的,异步更新list 的 item 是 在异步完成后,用item的index去找item 对象 找得到则更新,找不到则放弃.
然后我用list的getChildAt()方法找item对象...会给我报"Invalid child index";的错误.看了fgui laya版的源码 是
getChildAt(index) {
if (index >= 0 && index < this._children.length)
return this._children[index];
else
throw "Invalid child index";
}
所以这点我该怎么办呢.是虚拟列表 index 确实会有超过_children数组长度的时候.这时候就报错了......这里源码是不是或许应该改一改
我自己改成这样的了:
getChildAt(index) {
if (index >= 0 && index < this._children.length)
return this._children[index];
else {
//by nothing
console.warn("fgui getChildAt 索引越界 index:" + index);
return null;
}
}
//一下是我异步回调回来修改item的代码
private setMemberOptAvatar(index: number, cacheUser: CacheUserVO): void {
let cell = this.uiPanel.m_List_ClubMemb.getChildAt(index) as UI_Cell_Club_Member_Record;
if (!cell)
return
if (!cell.onStage)
return;
if ((cell.data as TClubMemberOptRec)?.refer_uid !== cacheUser.uid)
return;
cell.m_Com_Avatar.m_Loader_Avatar.url = cacheUser.avatar;
}
另外,itemRenderer里也不应该有new等会产生GC的操作,因为在滚动的过程中,itemRenderer调用的频率会非常高。
根据教程说的,异步更新list 的 item 是 在异步完成后,用item的index去找item 对象 找得到则更新,找不到则放弃.
然后我用list的getChildAt()方法找item对象...会给我报"Invalid child index";的错误.看了fgui laya版的源码 是
getChildAt(index) {
if (index >= 0 && index < this._children.length)
return this._children[index];
else
throw "Invalid child index";
}
所以这点我该怎么办呢.是虚拟列表 index 确实会有超过_children数组长度的时候.这时候就报错了......这里源码是不是或许应该改一改
我自己改成这样的了:
getChildAt(index) {
if (index >= 0 && index < this._children.length)
return this._children[index];
else {
//by nothing
console.warn("fgui getChildAt 索引越界 index:" + index);
return null;
}
}
//一下是我异步回调回来修改item的代码
private setMemberOptAvatar(index: number, cacheUser: CacheUserVO): void {
let cell = this.uiPanel.m_List_ClubMemb.getChildAt(index) as UI_Cell_Club_Member_Record;
if (!cell)
return
if (!cell.onStage)
return;
if ((cell.data as TClubMemberOptRec)?.refer_uid !== cacheUser.uid)
return;
cell.m_Com_Avatar.m_Loader_Avatar.url = cacheUser.avatar;
}
没有找到相关结果
已邀请:
2 个回复
谷主
赞同来自:
devxi
赞同来自: