2012-02-02 3 views
1

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

, к какому событию следует добавить слушателя в рендерере и как я могу вызвать такое событие из списка?

+0

Связанные данные поставщику данных –

ответ

1

Хмм .. Обычно вы не хотите напрямую манипулировать рендерингом элемента. Как правило, вы обновляете коллекцию.

Если опорный таймер первоначально устанавливается от поставщика данных, вы можете установить таймер и управлять этим свойством в коллекции ...

Что-то вроде этого:

//Timer listener function (dp is data provider) 
protected function handleTimerEvent(event:timerEvent):void 
{ 
    for(var i:int = 0; i < dp.length; i++) 
    { 
     var o:Object = dp.getItemAt(i); 
     o.minutes += 1; 

     if(o.minutes == 60) 
     { 
      o.minutes = 0; 
      o.hour += 1 
     } 
    } 

    dp.refresh(); 
} 

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

Использование события таймера в средстве рендеринга элементов может дать вам удар по производительности в зависимости от длины вашего датаподавателя. Скажем, у вас есть 100 строк данных, это 100 событий таймера!

+0

Идея заключалась в том, чтобы в списке был один таймер (и его обработчик). элементы набора данных имеют атрибуты, установленные в терминах дельта-времени с момента запуска таймера (т. е. timer.start()). то, что я хотел, было способом дать возможность игрокам понять, что они должны перепроверить времена дельты и сделать соответственно с учетом теперь. Перемещение всей коллекции - это альтернатива, которую я пытался избежать, поскольку я хотел сохранить ее как можно более доступную для чтения (это в основном доступный только для чтения элемент управления, который я пишу) – Dan

+0

В любом случае, манипулирование dp напрямую или изменение свойств данных в средстве рендеринга элемента имеет тот же эффект. Они оба обновляют dp. Это ссылочный объект и находится в той же ячейке памяти. Разница заключается в том, что IR делает то, что он должен делать (визуализировать данные), и ваши манипуляции с данными происходят снаружи. В любом случае это будет работать, но установка таймера в ИК-режиме не соответствует производительности. Даже если ИК повторно использует объект, у вас будет отображено столько элементов, как диспетчер TimerEvents и один таймер за пределами IR. –

0

Самый простой подход, с учетом информации, будет использовать Timer вызвать обновление, и вычислить разницу во времени в связывающем выражении или в commitProperties():

<?xml version="1.0" encoding="utf-8"?> 
    <s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" 
        autoDrawBackground="true" 
        initialize="init()" 
        > 

     <fx:Script> 
      <![CDATA[ 

       private var timer:Timer = new Timer(1000); 

       private function init():void 
       { 
        timer = new Timer(1000); 
        timer.addEventListener(TimerEvent.TIMER, timer_timerHandler); 
        timer.start(); 
       } 

       private function timer_timerHandler(event:TimerEvent):void 
       { 
        // cause a redraw 
        invalidateProperties(); 
       } 

       protected override function commitProperties():void 
       { 
        super.commitProperties(); 

        var date:Date = new Date(); 
        date.seconds += data.timeOffset; 
        displayDate = dateFormatter.format(date); 
       } 

       [Bindable] 
       private var displayDate:String; 

      ]]> 
     </fx:Script> 

     <fx:Declarations> 
      <s:DateTimeFormatter id="dateFormatter" dateTimePattern="HH:mm:ss" /> 
     </fx:Declarations> 

     <s:Label text="{data.label} - {displayDate}"/> 

    </s:ItemRenderer> 
+0

Я думал о наличии таймера в списке, а не о рендерере элементов (помните, что они перерабатываются). в Flex 3 был invalidateList(), который вызвал обновление всех средств визуализации. Я ищу что-то подобное на Спарке. – Dan

0

Попробуйте myList.invalidate() всякий раз, когда вы обнаружили изменения, которые происходят.