ItemRenderer Recycle 문제
맨날 쓰면서도 자주 실수하는 부분이 바로 아이템 렌더러 재사용 문제를 간과하는 것이다.
<?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처리를 해서 예외가 없도록 처리 해줘야한다.