2013-12-22 6 views
0

Не понимаю, почему, когда мы меняем данные на dataprovider, все вызываемые столбец itemRenderers? Вот небольшой пример моей проблемы:Flex s: DataGrid все ItemRenderer уволены

Применение:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)"> 

<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.events.FlexEvent; 

     private var _ac:ArrayCollection = new ArrayCollection(); 

     protected function application1_creationCompleteHandler(event:FlexEvent):void 
     { 
      var i:int = 10; 

      while(i >= 0) 
      { 
       _ac.addItem({fieldA:Math.random() * 100, fieldB:Math.random() * 100}); 
       i--; 
      } 

      dg.dataProvider = _ac; 
      dg.requestedRowCount = _ac.length; 
     } 

     protected function button1_clickHandler(event:MouseEvent):void 
     { 
      _ac.getItemAt(0)["fieldA"] = Math.random() * 100; 
      _ac.getItemAt(0)["fieldB"] = Math.random() * 100; 
      _ac.refresh(); 
     } 

    ]]> 
</fx:Script> 

<s:layout> 
    <s:VerticalLayout /> 
</s:layout> 

<s:Button label="change data" click="button1_clickHandler(event)" /> 

<s:DataGrid id="dg"> 
    <s:columns> 
     <s:ArrayList> 
      <s:GridColumn dataField="fieldA" itemRenderer="MyItemRenderer" /> 
      <s:GridColumn dataField="fieldB" /> 


    </s:ArrayList> 
     </s:columns> 
    </s:DataGrid> 

</s:Application> 

myItemRenderer:

<?xml version="1.0" encoding="utf-8"?> 
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" clipAndEnableScrolling="true"> 

    <fx:Declarations> 
     <s:Sequence id="myAnimation" duration="2000" target="{col}" > 
      <s:Fade alphaFrom="0.0" alphaTo="1.0"/> 
      <s:Fade alphaFrom="1.0" alphaTo="0.0"/> 
     </s:Sequence>     
    </fx:Declarations> 

    <fx:Script> 
     <![CDATA[ 

      private var _data:Object; 

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

       _data = value; 

       if(null != _data) 
       { 
        display(); 
       } 
      } 

      private function display():void 
      { 
       lblData.text = _data[column.dataField]; 
       myAnimation.play(); 
      } 

     ]]> 
    </fx:Script> 

    <s:Rect top="-2" left="0" right="0" bottom="-2"> 
     <s:fill> 
      <s:SolidColor id="col" color="0xFF0000" /> 
     </s:fill> 
    </s:Rect> 

    <s:Label id="lblData" top="9" left="7"/> 

</s:GridItemRenderer> 

Я просто хочу играть анимацию на затронутой ячейки, но каждый раз, анимация на каждой ячейке уволена. Как я могу это кодировать?

+0

A) Используйте сильно типизированные модели данных и B) верните ранний набор данных, если фактические данные не изменились. – drkstr1

+0

@ drkstr1: A) это просто пример. B) это не решит мою проблему. Я изменил код рендеринга элемента, но теперь он перерабатывается. ПРЕЖДЕ ЧЕМ происходит эффект, когда другие данные обновляются. Я ищу способ предотвратить повторное использование моего рендеринга элемента во время его действия. –

ответ

1

Причина для всей этой переработки заключается в следующем: вы вызываете метод refresh, поэтому вы явно запрашиваете всю эту переработку. Это приведет к аннулированию всех видов и фильтров, применяемых к вашей коллекции, поэтому все позиции элементов в datagrid недействительны, и каждый элемент перерабатывается.

Вы должны удалить этот звонок. После того, что что-то подобное должно делать то, что вы ожидаете:

private var colValue:String; 

    override public function prepare(hasBeenRecycled:Boolean):void { 
     if (data && colValue != data[column.dataField]) { 
      colValue = data[column.dataField]; 
      lblData.text = colValue; 
      myAnimation.play(); 
     } 
    } 

Метод prepare по-прежнему будет вызываться каждый раз, но ваша анимация будет проигрываться только тогда, когда значение фактически изменилось.

+0

спасибо! В предыдущие дни я сделал некоторые изменения в своем коде для оптимизации производительности, и я не помнил, что я удалил Bindable метаданные на свой объект данных, вместо этого вместо этого использовал метод refresh (-> bad try). Теперь он работает как charme снова, чтобы указать метод обновления. –

Смежные вопросы