맨날 쓰면서도 자주 실수하는 부분이 바로 아이템 렌더러 재사용 문제를 간과하는 것이다.

<?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처리를 해서 예외가 없도록 처리 해줘야한다.

 

Posted by 미랭군