맨날 쓰면서도 자주 실수하는 부분이 바로 아이템 렌더러 재사용 문제를 간과하는 것이다.
<?xml version="1.0" encoding="utf-8"?>
<s:MXAdvancedDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
focusEnabled="true"
>
<fx:Script>
<![CDATA[
import com.utils.ColorUtil;
override public function set data(value:Object):void
{
// not sure of the details on when or why, but sometimes this method is passed a null value
if(value != null)
{
super.data = value;
// set itemRenderer's state based on data value
var strAlmLvlCri :String = "1";
var strAlmLvlMaj :String = "2";
var strAlmLvlMin :String = "3";
var strAlmLvlWarn:String = "4";
if(listData.label == strAlmLvlCri) { // Critical
fillColor.alpha = 1;
fillColor.color = ColorUtil.getArmLvlInfo(strAlmLvlCri).NUM_COLOR;
lblData.text = ColorUtil.getArmLvlInfo(strAlmLvlCri).NAME;
} else if(listData.label == strAlmLvlMaj) { // Major
fillColor.alpha = 1;
fillColor.color = ColorUtil.getArmLvlInfo(strAlmLvlMaj).NUM_COLOR;
lblData.text = ColorUtil.getArmLvlInfo(strAlmLvlMaj).NAME;
} else if(listData.label == strAlmLvlMin) { // Minor
fillColor.alpha = 1;
fillColor.color = ColorUtil.getArmLvlInfo(strAlmLvlMin).NUM_COLOR;
lblData.text = ColorUtil.getArmLvlInfo(strAlmLvlMin).NAME;
} else if(listData.label == strAlmLvlWarn) { // Warning
fillColor.alpha = 1;
fillColor.color = ColorUtil.getArmLvlInfo(strAlmLvlWarn).NUM_COLOR;
lblData.text = ColorUtil.getArmLvlInfo(strAlmLvlWarn).NAME;
} else { // etc
fillColor.alpha = 0;
lblData.text = "";
}
}
}
]]>
</fx:Script>
<s:Rect left="0" right="0" top="0" bottom="0">
<s:fill>
<s:SolidColor id="fillColor" alpha="1" />
</s:fill>
</s:Rect>
<s:Label id="lblData" horizontalCenter="0" verticalCenter="0"/>
</s:MXAdvancedDataGridItemRenderer>
자주 쓰는 아이템 렌더러 형태이다. 빨간색 부분을 FLEX에서는 메모리 효율성을 위해 재사용을 한다.
그런데 문제가 되는 부분은 파란색 부분이다. if, else if, else 이런 식으로 예외처리까지 되어있을 경우에는 상관이 없다.
하지만 if, else if까지만 되어있다면 이에 해당되지 않는 내용이 들어왔을 때는 기존에 상태를 그대로 기억하고 있다.
이 문제를 해결하기 위해서는 초기화를 해주거나 위 예제와 같이 else처리를 해서 예외가 없도록 처리 해줘야한다.
'플렉스·플래시·액션스크립트3' 카테고리의 다른 글
[MouseEvent] RIGHT_CLICK 이벤트 추가 (0) | 2013.02.07 |
---|---|
MouseEvent에서 좌표 값 가져오기(MouseX,Y vs LocalX,Y) (0) | 2013.02.06 |
ItemRenderer 데이터 전달하기2 (0) | 2012.11.28 |
ItemRenderer에 데이터 넘기기 (0) | 2012.11.28 |
초를 일, 시간, 분 단위로 변환 (0) | 2012.11.20 |