2011-09-07 48 views
0

我甚至不知道如何解釋這種行爲,但我會嘗試。我從需要基本身份驗證的外部URL加載圖像,因此我使用URLLoader從唯一ID加載圖像。該ID傳遞給itemrenderer,然後繼續加載圖像。但是當我滾動時,圖像自己切換。如果我負荷超過7倍的圖像或所以它開始重複圖像....ItemRenderer切換URLLoader圖片

誤差的

的Youtube視頻: http://www.youtube.com/watch?v=ZYoqlS14gWQ

相關的代碼:

<s:ItemRenderer name="RandomItemRenderer" creationComplete="init();" 
      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="false"> 
<s:states> 
    <s:State name="normal" /> 
    <s:State name="hovered" /> 
    <s:State name="selected" /> 
</s:states> 

<fx:Script> 
    <![CDATA[ 
     import flash.net.URLLoader; 
     import flash.net.URLLoaderDataFormat; 
     import flash.net.URLRequest; 
     import flash.net.URLRequestHeader; 
     import flash.net.URLRequestMethod; 

     import mx.utils.ObjectProxy; 

     import customclasses.Settings; 

     [Bindable] private var coverArtImage:Image; 
     private var myCoverArtLoader:URLLoader; 

     [Bindable] private var coverArtSource:String; 

     private function init():void { 
      get_coverArt(); 
     } 

     private function get_coverArt(): void { 
      if (!data.coverArt) { 
       set_nullCoverArt(); 
      } else { 
       var requestString:String = "/rest/getCoverArt.view?v=1.5.0&c=AirSub&id=" + data.coverArt; 
       var requestURL:String = Settings.ServerURL + requestString; 

       myCoverArtLoader = new URLLoader(); 
       var myRequest:URLRequest = new URLRequest(); 

       var authHeader:URLRequestHeader = new URLRequestHeader(); 
       authHeader.name = 'Authorization'; 
       authHeader.value = 'Basic ' + Settings.EncryptedCreds(); 

       myRequest.requestHeaders.push(authHeader); 
       myRequest.url = requestURL; 
       myRequest.method = URLRequestMethod.GET; 
       myCoverArtLoader.dataFormat = URLLoaderDataFormat.BINARY; 

       myCoverArtLoader.addEventListener(Event.COMPLETE, set_coverArt); 
       myCoverArtLoader.addEventListener(IOErrorEvent.IO_ERROR, set_failedCoverArt); 
       myCoverArtLoader.load(myRequest); 
      } 
     } 

     private function set_coverArt(evt:Event) : void { 
      coverArtImage = new Image(); 
      coverArtImage.source = myCoverArtLoader.data;   
      myCoverArtLoader.removeEventListener(Event.COMPLETE, set_coverArt); 
     } 

     private function set_nullCoverArt() : void { 
      coverArtImage = new Image(); 
      coverArtImage.source = "assets/nullCoverArt.jpg"; 
     } 

     private function set_failedCoverArt() : void { 
      coverArtImage = new Image(); 
      coverArtImage.source = "assets/nullCoverArt.jpg"; 
      myCoverArtLoader.addEventListener(IOErrorEvent.IO_ERROR, set_nullCoverArt); 
     } 

    ]]> 
</fx:Script> 

<s:Image source.normal="assets/coverOutline.png" source.selected="assets/coverOutlineYellow.png" source.hovered="assets/coverOutlineYellow.png" 
     height="226" width="226" /> 

<s:VGroup top="4.5" bottom="5" width="200" horizontalAlign="center" letterSpacing="10" 
      paddingBottom="5" paddingTop="9" verticalAlign="middle" x="13.5"> 
    <s:Image id="ui_imgCoverArt" width="200" height="200" source="{coverArtImage.source}"/> 
    <s:Label text="{data.title}" width="160" styleName="RandomList" /> 
</s:VGroup> 

回答

2

itemRenderer是可重複使用和緩存,即在列表中創建的計數僅限於填充其區域(rowCount + - couple)。當你滾動時,新的渲染器不會被實例化,而是被滾動出來的一個渲染器會上下移動並充滿新的數據。

這就是爲什麼你不能依靠creationComplete事件,它會被渲染一次渲染器的每個實例。

的解決方案是重寫data setter和建立有需要的行爲:

override public function set data(value:Object):void 
{ 
    super.data = value; 
    get_coverArt(); 
} 

有用的鏈接:How flex itemRenderer works ? (their life cycle)

+0

丫不知道 - 如果你能提供一個簡單的例子或也許鏈接如何覆蓋真棒的數據。謝謝! –

+0

檢查更新回答 – moropus

+0

太棒了 - 謝謝!我今晚會嘗試。 –