2010-03-05 21 views
3

我有一個項目渲染器,它檢查顯示信息的外部源。如果該信息發生變化,我想強制所有項目渲染器實例進行檢查。強制所有項呈示器commitProperties?

將列表或網格中的所有項目渲染器強制爲commitProperties或執行其他方法的最佳方法是什麼?

  • 我讀過重置 grid.itemRenderer屬性將讓 他們全部初始化。

  • 我也收到了建議, 遞歸迭代通過所有 電網的孩子,並呼籲invalidateProperties 所有我找到的UIComponents。

有什麼想法?備擇方案?

回答

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.S.我在完全基於Spark的DataGrid上完成最後的工作,我會在完成後發佈鏈接。

0

Datagroup具有getItemIndicesInView(),它將爲您提供所有可見的項目渲染器的標記。用這些標記調用getElementAt。

我通常還會擴展ItemRenderer並添加以下內容,這會導致項呈示器的狀態刷新。

public function invalidateSkinState():void 
    { 
     super.invalidateRendererState(); 
    } 
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); 
     } 
    } 

工作正常,我

相關問題