2012-02-05 106 views
0

我已經在flex中創建了一個項目渲染器spark list,但是我想調用一個函數來添加列表中的新行,而不是之後。我得到一個數據對象在它的呈現列表中,我得到的數據類型將顯示在列表即。文字或圖像。因此,在列表中添加新數據時,我希望在渲染列表中調用函數,以檢查接收到的數據類型,然後創建並添加圖像元素或文本元素。所以主要的問題是我如何獲得一個函數調用添加數據。我已經嘗試過像datachange這樣的事件並添加了它們,但是當我們滾動列表時,它們會一直重複調用函數,但是我希望函數只在添加數據時調用一次,而不是在病房後調用。下面是渲染器列表代碼,也許你會得到什麼,我試圖做一個更好的主意:Flex列表項目渲染器

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       autoDrawBackground="true" dataChange="test_add()"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      public function test_add() : void { 
       Alert.show("type="+data.msg_type);  
       if(data.msg_type=="text"){ 
        //code to create and add new text element to list_row// 
       } 
       if(data.msg_type=="image"){ 
        //code to create and add new image element to list_row// 
       } 
      } 

     ]]> 
    </fx:Script> 

    <s:Group id="list_row" width="100%" verticalAlign="middle" verticalCenter="0"> 

    </s:Group> 
</s:ItemRenderer> 

任何幫助將得到高度讚賞。 謝謝

回答

1

據我所知,您所展示的代碼最簡單的解決方案就是使用兩個單獨的ItemRenderer:一個呈現文本,另一個呈現圖像。您可以使用SkinnableDataContainer#itemRendererFunction屬性來代替itemRenderer

新特性列表:

<s:List id="myList" dataProvider="{dp}" 
     itemRendererFunction="getItemRenderer" /> 

,用於返回正確的ItemRenderer工廠的功能。

private function getItemRenderer(item:Object):IFactory { 
    if (item.msg_type == "text") 
     return new ClassFactory(MyTextItemRenderer); 
    if (item.msg_type == "image") 
     return new ClassFactory(MyImageItemRenderer); 
} 

在這兩個不同的ItemRenderer中,您可以隨意顯示數據。


編輯:爲什麼它確定了dataChange事件觸發每次滾動的時間。

你描述的方法實際上沒有什麼問題,但我認爲itemRendererFunction方法可以更好地分離問題。我可以告訴你,只需將List#useVirtualLayout屬性設置爲false即可關閉不需要的行爲。

<s:List id="myList" dataProvider="{dp}" 
     itemRenderer="myItemRenderer" useVirtualLayout="false" /> 

雖然這會做你所要求的(即只創建一次ItemRenderer),但這不是一個好建議。這個屬性在默認情況下設置爲true是有很好的理由的。

使用虛擬佈局時,項目渲染器僅在需要時創建,即當它們進入視圖並需要顯示給用戶時。這使您可以加載數千個項目而不會損失性能。

假設您加載了1000個值對象:它不佔用太多內存或CPU。但現在你想渲染它們。如果您不使用虛擬佈局,則會爲所有人創建項目渲染器,這意味着數千個圖形元素和數千個事件偵聽器(多少完全取決於您的設置)。現在會在慢速電腦上損害性能。

如果您只使用虛擬佈局 - 比方說 - 將會一次創建10個項目渲染器。如果用戶向下滾動,則下一個10將被創建,並且剛剛從視圖中消失的那個被刪除,並最終被垃圾收集。所以你看到:你可能已經認識到一開始對性能不利的事情,實際上是一件非常好的事情。

所以我建議你不要做我剛纔告訴你的。除非你可能會遇到這樣的情況,即你知道列表中永遠不會超過非常有限的數量。那麼你可能會考慮不使用虛擬佈局。

+0

嗨,謝謝你的回覆。但是我需要按照上面提到的方式來完成,因爲計劃完成更復雜的事情,並且不可能爲每個條件創建itemrenderer。 – user1190524 2012-02-05 16:17:12

+0

@ user1190524我已經更新了一些附加信息的答案。 – RIAstar 2012-02-05 23:33:14

+0

感謝您的更新,但我想要做的是在項目渲染中添加圖像/文本在一個組中,它不固定多少圖像/文本會出現在數據中。所以基本上它的行列表包含文本/圖像和沒有。在一行中的文本/圖像不固定。所以我使用AS創建這些文本/圖像(與特定行所需的數量相同)。但是如果我滾動列表,itemrender代碼會再次執行,如果一行中有5個圖像/文本元素,它們將變爲10,因爲渲染代碼將再次執行。請讓我知道是否有更好的方法來做到這一點。謝謝 – user1190524 2012-02-06 11:50:27