我有一个项目渲染器,用于检查外部源以获取显示信息。如果该信息发生变化,我想强制所有项目渲染器实例进行检查。
将列表或网格中的所有项目渲染器强制为commitProperties
或执行其他方法的最佳方法是什么?
我读过重置的
grid.itemRenderer
属性将成为
他们都初始化。
我也收到了建议
迭代遍历所有的迭代
网格的孩子并致电invalidateProperties
在我找到的所有UIComponents上。
有什么想法?替代?
答案 0 :(得分:1)
请记住,在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虚拟化,所以我没有找到你的答案。< / p>
P.S。我正在完成一个完全基于Spark的DataGrid,我会在完成后发布链接。
答案 1 :(得分:0)
Datagroup具有getItemIndicesInView(),它将为您提供视图中所有项呈示器的指示。用这些指标调用getElementAt。
我通常也会扩展ItemRenderer并添加以下内容,这将导致项呈示器的状态刷新。
public function invalidateSkinState():void
{
super.invalidateRendererState();
}
答案 2 :(得分:0)
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 );
}
}
对我来说很好用