как обновить средства визуализации элементов и изменить их состояние? - PullRequest
1 голос
/ 03 февраля 2012

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

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

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

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

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

Примерно так:

//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 голосов
/ 03 февраля 2012

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

0 голосов
/ 03 февраля 2012

Самый простой подход, учитывая информацию, состоит в том, чтобы использовать 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>
...