请教下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;
}
 
已邀请:

谷主

赞同来自:

麻烦虚拟列表教程认真看完,不要看一段不看一段

devxi

赞同来自:

好吧 所以是要用显示对象索引而不是item索引是吗

要回复问题请先登录注册