2013-01-06 31 views
0

我有List的自定義LabelItemRenderer,並重寫設置數據函數。在每個數據中,我都有屬性「銷售」,可以是真或假。取決於這個屬性我m adding icon. Everything seems fine until i米將滾動列表向下幾次。對於設置爲false的列表索引,銷售額爲true。我檢查了我的數據提供者並且無法找到錯誤,但是在我的自定義項目中,渲染數據是錯誤的,並且圖標顯示在錯誤的地方。錯誤的數據在自定義LabelItemRenderer

這裏是我的代碼:

package components { 

import flash.display.Bitmap; 

import spark.components.LabelItemRenderer; 
import spark.components.supportClasses.StyleableTextField; 
import spark.primitives.BitmapImage; 

public class StoresList extends LabelItemRenderer { 

    private var storeName:StyleableTextField; 
    private var floor:StyleableTextField; 
    private var mapListIco:Bitmap; 
    private var promotions:Bitmap; 
    private var sales:Boolean; 
    private var compData:Object; 

    public function StoresList() { 

     super(); 
    } 


    override public function set data(value:Object):void { 

     compData = value; 

     storeName.text = compData.title; 
     floor.text = 'floor : ' + compData.floor; 

     if (compData.sales && compData.salesIco) { 
      promotions = compData.salesIco; 
      addChild(promotions); 
     } 
    } 

    private function createStoreName():void { 

     storeName = StyleableTextField(createInFontContext(StyleableTextField)); 
     storeName.editable = false; 
     storeName.selectable = false; 
     storeName.multiline = false; 
     storeName.wordWrap = false; 
     storeName.styleDeclaration = styleManager.getStyleDeclaration(".titleStyleName"); 

     addChild(storeName); 
    } 

    private function createFloortextField():void { 

     floor = StyleableTextField(createInFontContext(StyleableTextField)); 
     floor.editable = false; 
     floor.selectable = false; 
     floor.multiline = false; 
     floor.wordWrap = false; 
     floor.styleDeclaration = styleManager.getStyleDeclaration(".floor"); 

     addChild(floor); 
    } 


    override protected function createChildren():void { 

     // store name 
     createStoreName(); 

     // floor 
     createFloortextField(); 

     // maplist ico 
     mapListIco = new Textures.mapListIco160; 
     addChild(mapListIco); 
    } 


    override protected function measure():void { 

     measuredWidth = getElementPreferredWidth(storeName) + getElementPreferredWidth(floor); 
     // We only care about the "real" ascent 
     measuredHeight = getElementPreferredHeight(storeName) + getElementPreferredHeight(floor); 
    } 


    override protected function drawBackground(unscaledWidth:Number, unscaledHeight:Number):void { 

     super.drawBackground(unscaledWidth, unscaledHeight); 
    } 


    override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void { 

     // store name 
     var gap:Number = Math.round(unscaledHeight * .1); 
     var storeNameHeight:Number = getElementPreferredHeight(storeName); 
     var floorHeight:Number = getElementPreferredHeight(storeName); 
     var storenameY:Number = Math.round((unscaledHeight - (storeNameHeight + floorHeight + gap)) * .5); 

     setElementSize(storeName, storeName.textWidth, storeName.textHeight); 
     setElementPosition(storeName, unscaledWidth * .15, storenameY); 

     // floor 
     var floorY:Number = Math.round(storenameY + storeNameHeight); 
     setElementPosition(floor, unscaledWidth * .15, floorY + gap); 

     // map list 
     setElementPosition(mapListIco, unscaledWidth - mapListIco.width - unscaledWidth * .05, (unscaledHeight - mapListIco.height) * .5); 

     // promotions 
     if (promotions) { 

      setElementPosition(promotions, 
       (unscaledWidth * .15 - getElementPreferredWidth(promotions)) * .5, 
       (unscaledHeight - getElementPreferredHeight(promotions)) * .5) 
     } 
    } 

} 

}

回答

0

itemRenderer是重用 - 因此,當一個渲染器賦予了新的數據[通過一組數據()],你需要明確的是,不使用任何數據。在你的情況下,你需要明確地隱藏圖標(因爲它可能在上次使用渲染器時可見)。例如:

override public function set data(value:Object):void { 
    //always call super on an overriden function unless you have specific reason not to 
    super.data = value; 
    ... 
    if (compData.sales && compData.salesIco) { 
     promotions = compData.salesIco; 
     promotions.visible = true; 
    } 
    else 
    { 
     promotions.visible = false; 
    } 
} 

我建議創建促銷位圖createChildren而不是一組數據 - 如反覆添加和刪除它是一個相對昂貴的操作。

+0

謝謝你,我在createChildren中移動了促銷的創建,並在設置新數據時將其隱藏。現在一切工作正常.. 10倍 –