我有一个项目渲染器,它检查外部源以获取显示信息。如果该信息发生变化,我想强制所有项目渲染器实例检查它。
强制列表或网格中的所有项目渲染器commitProperties
执行或执行其他方法的最佳方法是什么?
我读过重置
grid.itemRenderer
属性将使它们全部初始化。我还收到了递归遍历所有网格子节点并调用
invalidateProperties
我找到的所有 UIComponents 的建议。
有什么想法吗?备择方案?
我有一个项目渲染器,它检查外部源以获取显示信息。如果该信息发生变化,我想强制所有项目渲染器实例检查它。
强制列表或网格中的所有项目渲染器commitProperties
执行或执行其他方法的最佳方法是什么?
我读过重置
grid.itemRenderer
属性将使它们全部初始化。
我还收到了递归遍历所有网格子节点并调用invalidateProperties
我找到的所有 UIComponents 的建议。
有什么想法吗?备择方案?
请记住,在 Flex 列表中,您正在处理虚拟化和 itemRenderer 回收,因此通常只有当前可见的 itemRenderer 实际存在,因此是实际需要更新的。
以下适用于基于 Spark 列表的控件:
for ( var i:int=0; i< sparkList.dataGroup.numElements; i++ )
{
var element:UIComponent = sparkList.dataGroup.getElementAt( i ) as UIComponent;
if ( element )
element.invalidateProperties();
else
trace("element " + i.toString() + " wasn't there");
}
如果您有 100 个项目,这将更新 10 个可见项目并忽略虚拟其余部分。
如果您正在使用 mx DataGrid,您可能想尝试这个变体 - 但它不使用 DataGroup / Spark 虚拟化,所以我无法为您提供答案。
PS 我正在对一个完全基于 Spark 的 DataGrid 进行最后润色,完成后我会发布链接。
Datagroup 具有 getItemIndicesInView() ,它将为您提供所有可见项目渲染器的索引。使用这些指标调用 getElementAt。
我通常还扩展 ItemRenderer 并添加以下内容,这将导致项目渲染器的状态刷新。
public function invalidateSkinState():void
{
super.invalidateRendererState();
}
public function updateAllRenderer():void
{
if (!list.dataGroup)
return;
if (!list.dataGroup.dataProvider)
return;
for ( var index:int=0; index< list.dataGroup.numElements; index++ )
{
var item:Object = list.dataGroup.dataProvider.getItemAt(index);
var renderer:IVisualElement = list.dataGroup.getElementAt( index ) as IVisualElement;
if ( renderer )
list.updateRenderer( renderer, index, item );
}
}
对我来说很好