我有一個項目渲染器,它檢查顯示信息的外部源。如果該信息發生變化,我想強制所有項目渲染器實例進行檢查。強制所有項呈示器commitProperties?
將列表或網格中的所有項目渲染器強制爲commitProperties
或執行其他方法的最佳方法是什麼?
我讀過重置
grid.itemRenderer
屬性將讓 他們全部初始化。我也收到了建議, 遞歸迭代通過所有 電網的孩子,並呼籲
invalidateProperties
所有我找到的UIComponents。
有什麼想法?備擇方案?
我有一個項目渲染器,它檢查顯示信息的外部源。如果該信息發生變化,我想強制所有項目渲染器實例進行檢查。強制所有項呈示器commitProperties?
將列表或網格中的所有項目渲染器強制爲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虛擬化,所以我沒有爲你解答我的問題。
P.S.我在完全基於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);
}
}
工作正常,我