2012-01-30 54 views
1

我有一個使用itemRendererFunction獲取自定義項目渲染器的列表。有沒有辦法只重新評估列表中的一個項目並獲得不同的項目渲染器?如何觸發itemRendererFunction在Flex中的數據更改時再次調用

想象這樣的代碼:

有兩個項目渲染器ItemRendererOne.mxml和ItemRendererTwo.mxml

Data.as

package { 

    public class Data { 

     private var _data : Boolean = false; 

     [Bindable] 
     public function get data():Boolean { 
      return _data; 
     } 

     public function set data(value:Boolean) : void { 
      _data = value; 
     } 

     public function Data(value : Boolean) { 
      _data = value; 
     } 
    } 
} 

和主要的應用程序是

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" > 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayList; 

      private var dataProvider : ArrayList = new ArrayList([new Data(true), new Data(false)]); 

      public function getItemRenderer(data : Object) : IFactory { 
       if (data.data) { 
        return new ClassFactory(ItemRendererOne); 
       } else { 
        return new ClassFactory(ItemRendererTwo); 
       } 
      } 

      protected function button1_clickHandler(event : MouseEvent) : void { 
       var data : Data = dataProvider.getItemAt(0) as Data; 
       data.data = !data.data; 
      } 

     ]]> 
    </fx:Script> 

    <s:VGroup> 
     <s:List dataProvider="{dataProvider}" itemRendererFunction="{getItemRenderer}" /> 

     <s:Button click="button1_clickHandler(event)" /> 
    </s:VGroup> 

</s:WindowedApplication> 

基本上當有人點擊按鈕時,我想讓getItemRenderer成爲cal再次領導並且列表中的項目用新項目渲染器更新。

+0

不看好這個,所以我沒有張貼作爲一個答案,但你嘗試過myListId.invalidateList()認爲,這將導致其再次調用itemRendererFunction每個元素在列表中。 – shaunhusain 2012-01-30 22:42:40

+0

(我猜你的意思是invalidateDisplayList()) 似乎沒有工作。只有我得到項目渲染器刷新才能完全重置數據提供者。但這會導致所有項目重繪並導致閃爍,我不想要 – lordofthefobs 2012-01-30 22:50:52

+0

我其實的意思是invalidateList(),但我也來自一個主要是Flex 3的角度來看,相信這是一個可用的方法在數據網格上(如果沒有它必須是先進的數據網格),但它導致列表中的項目失效,我相信他們在過去幫助過類似的情景。如果你仍然沒有找到可行的解決方案,我會嘗試建立並找出需要做的事情。 – shaunhusain 2012-02-01 19:29:15

回答

1

不確定關於Flex 4,因爲我主要在Flex 3中工作,但設置應該接近。
基本上,讓渲染處理渲染。

您的列表應該看起來像這樣。

有3個非常重要的覆蓋可以控制渲染器對數據作出反應的方式。
1)設置數據用於指定新數據時
2)createChildren將允許您動態創建子項。我相信這是你正在尋找與設置數據相結合的功能
3)commitProperties這是你將數據分配給像我的標籤示例或動態創建的孩子那樣硬編碼的孩子的地方。

我在過去所做的事情是相似的。
我重新測試當前佈局的數據,如果它不是正確的佈局,我重建它。
因此,在設置數據方法中,我測試佈局是否錯誤,我調用createChildren()。
我想你可以在調用設置數據中的super.data之前測試舊數據的數據結構,但是我沒有那樣的好結果。

myRenderer.mxml

<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" > 
    <mx:Script> 
     <![CDATA[ 
     override public function set data(val:Object):void{ 
      super.data = val; 
      if(!val){ 
      return; 
      } 
      // test data here if current layout is wrong rebuild it by calling createchildren 
     } 
     override protected function createChildren():void{ 
      super.createChildren() 
      if(this.data == null){ 
      return; 
      } 
      // create your data driven layout here 
     } 
     override protected function commitProperties():void{ 
      super.commitProperties(); 
      if (data == null){ 
      return; 
      } 
     } 

     ]]> 
    </mx:Script> 
    <mx:Label id="myLabel" text="{data.someLabelVar} /> 
</mx:VBox> 
+0

我正在考慮這樣做。從技術上講,如果我使用多個狀態,這不會太難。然而,我的項目渲染是非常複雜的,用actionscript編寫的,並使用自定義佈局...整個原因,我與AS項目渲染器一起去使它輕,我認爲將所有的邏輯添加到項目渲染器會否定好處.. – lordofthefobs 2012-01-30 23:59:44

+0

你使用你的項目渲染器來創建你的類(ItemRendererOne和ItemRendererTwo),並將它們作爲子代添加到渲染器中。更容易的是,你認爲你已經完成了一半的工作。噢,無需國家。 – 2012-01-31 00:29:40

+0

嗯有趣..會工作...但它確實引入了另一層UIComponent。同樣,每個項目渲染器都會有我所有的自定義渲染器,這似乎是多餘的。 – lordofthefobs 2012-01-31 00:37:37

相關問題