2012-02-02 84 views
1

我有一個與時間相關的數據列表。 這次項目渲染器顯示。 我想讓項目渲染器在計時器打勾時刷新它們的狀態/標籤。如何刷新項目渲染器並更改其狀態?

我應該在渲染器中添加偵聽器,以及如何從列表中觸發此類事件?

+0

將數據綁定到數據提供者 – 2012-02-02 22:53:43

回答

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 2012-02-03 17:22:39

+0

無論哪種方式,直接操作dp或修改數據屬性在項目渲染器中具有相同的效果。他們都更新了DP。它是一個被引用的對象,位於同一個內存位置。不同之處在於IR執行它所要做的(呈現數據)並且您的數據操作發生在外部。無論哪種方式都可以工作,但在IR中設置定時器不是性能友好的。即使IR重新使用該對象,您也將顯示調度TimerEvent與IR之外的一個TimerEvent的項目數量。 – 2012-02-03 20:38:47

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(),它具有刷新所有渲染器的效果。我在Spark上尋找類似的東西。 – Dan 2012-02-03 05:41:35

0

嘗試myList.invalidate()每當你發現發生的變化。