2009-06-12 85 views
1

我正在實現一個自定義Flex組件,該組件提供了一個可滾動的視圖到一個(可能非常大的)數據網格上。我使用ItemRenderer模式,這樣我就只有UIComponents在給定的時間在屏幕上可見的元素。換句話說,類似於標準DataGrid控件。'預先測量'Flex組件

我的一個要求是動態調整網格單元的大小以適應提供的數據,以便列寬和行高度在前面已知。 (當用戶滾動並看到新的單元格時,列寬和行高不會波動。)

此需求意味着當組件的dataSource或itemRenderer執行整個網格的「預先測量」階段被改變。我想使用標準Flex組件測量操作來執行此預測量階段。

我此度量預相電流的策略是:

  • 獲得一個的itemRenderer實例
  • 初始化的itemRenderer
  • 對於數據源中的每一個小區:
    • 設置itemRenderer的'數據'對象到該單元格的數據
    • 'commitProperties()'部件
    • 「度量()」基於測量所組分
    • 更新列寬/行高度適當地導致

我寧願不附着的itemRenderer到應用程序的顯示列表中,但是這意味着它將不會被框架初始化。另外,我需要渲染器的初始化和commitProperties/measurement階段同步發生。我害怕我必須複製多少Flex組件生命週期管理框架才能完成此任務。

所以我呼籲那些比我更有經驗的至理名言:

  • 這一策略的可行性有什麼想法?
  • 關於我如何優雅地使用框架來爲我執行此度量的任何建議?
  • 任何更好的策略來確定細胞大小?

回答

1

我研究了一下框架代碼,如果最初的結果是一個跡象,這並不像我擔心的那樣痛苦。它的膽量:

var renderer:IListItemRenderer = getRenderer(); 
renderer.initialize(); 
for each (var cell:Object in cells) { 
    renderer.data = cell; 
    renderer.validateProperties(); 
    renderer.validateSize(true); 
    // Access renderer's size properties here 
} 

將'recursive = true'標誌傳遞給validateSize是我之前缺少的關鍵。不幸的是,沒有用於validateProperties的等效標誌,所以我可能必須自己實現這個標誌才能使它對於任意ItemRenderer是可靠的。

0

我從來沒有申請itemRenderer的這種方式,所以,不知道有多少,這將開始發揮作用與你的做法,但你在你的渲染器數據的頂部設置

super.data = data

設定裝置?即:

override public function set data(value:Object):void
{
        super.data = value;
        ...
}

如果沒有,你可以嘗試補充說,看看它是否消除了遞歸標誌的需要在validateProperties()

+0

是的,令人驚訝的是我已經記得設置super.data。 :)編寫我自己的遞歸例程是一件簡單的事情,它似乎目前運行良好。 乾杯! – Aron 2009-06-12 23:16:33