如何刷新项目渲染器并更改其状态?

时间:2012-02-02 22:17:18

标签: actionscript-3 flex4 itemrenderer

我有一个包含时间相关数据的列表。 项目渲染器显示此时间。 我想让项目渲染器在计时器的勾号上刷新状态/标签。

我应该在渲染器中添加一个侦听器,以及如何从列表中触发此类事件?

3 个答案:

答案 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个计时器事件!

答案 1 :(得分: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>

答案 2 :(得分:0)

每当检测到发生的更改时,请尝试myList.invalidate()