Actionscript 3 如何刷新项目呈现器并更改其状态?

Actionscript 3 如何刷新项目呈现器并更改其状态?,actionscript-3,flex4,itemrenderer,Actionscript 3,Flex4,Itemrenderer,我有一个与时间相关的数据列表。 此时将显示项目渲染器。 我想让项目渲染器在计时器发出滴答声时刷新其状态/标签 我应该在渲染器中向哪个事件添加侦听器,以及如何从列表中触发此类事件?鉴于信息,最简单的方法是使用计时器进行刷新,并计算绑定表达式或commitProperties()内的时差: 每当检测到发生更改时,请尝试myList.invalidate()。Hmm。。通常不希望直接操作项目渲染器。通常,您会更新集合 如果计时器引用最初是从数据提供程序设置的,则可能需要设置计时器并在集合中操作该属性

我有一个与时间相关的数据列表。 此时将显示项目渲染器。 我想让项目渲染器在计时器发出滴答声时刷新其状态/标签


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

鉴于信息,最简单的方法是使用
计时器进行刷新,并计算绑定表达式或
commitProperties()内的时差:



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

Hmm。。通常不希望直接操作项目渲染器。通常,您会更新集合

如果计时器引用最初是从数据提供程序设置的,则可能需要设置计时器并在集合中操作该属性

大概是这样的:

//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();
}
//计时器侦听器函数(dp是数据提供程序)
受保护函数handleTimerEvent(事件:timerEvent):无效
{
对于(变量i:int=0;i
如果在项目渲染器中引用了分钟和小时,您应该会看到每一分钟和小时都会更新。当然,你必须添加更好的逻辑来处理其他约会内容。您可能希望使用date类来显示更准确的时间信息


根据数据提供程序的长度,在项目呈现程序中使用计时器事件可能会对性能产生影响。假设您有100行数据,即100个计时器事件

将可绑定数据绑定到数据提供程序我考虑将计时器放在列表上,而不是放在项目呈现程序上(记住它们是循环使用的)。在Flex3中有invalidateList(),它具有刷新所有渲染器的效果。我正在Spark上寻找类似的东西。我的想法是在列表中有一个计时器(及其处理程序)。dataprovider元素的属性设置为自计时器启动以来的增量时间(即timer.start())。我想要的是一种让ItemRenders知道他们应该重新计算delta时间并根据现在进行相应渲染的方法。遍历整个集合是我试图避免的另一种选择,因为我希望尽可能将其保持为只读(我正在编写的主要是只读控件),无论是直接操作dp还是在项目呈现器中修改数据属性,都具有相同的效果。它们都更新了dp。它是一个被引用的对象,位于同一内存位置。不同之处在于IR执行它假定要执行的操作(渲染数据),而您的数据操作在外部进行。这两种方法都可以,但在IR中设置计时器对性能不友好。即使IR重用该对象,您也会在IR之外显示相同数量的项目,即发送TimerEvents与显示一个TimerEvents。
//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();
}