2009-09-30 33 views
0

您好我有一個Air應用程序,可下載大約100000個對象的數據集並將這些對象放入ArrayCollection中。Adob​​e Air/Flex過濾大型數據集

我想將各種過濾器應用於整個應用程序中衆多屏幕中的數據集。 如果我製作集合的多個副本,我有點擔心可能的性能問題。但是,如果我不復制集合,則所有應用的過濾器都將反映在所有屏幕中,這不是我需要的行爲。

給這個大型數據集合提供多個視圖的最好方法是什麼? 有沒有人有這種情況下的任何經驗。 任何幫助非常感謝。

回答

1

您可以使用充當原始ArrayCollection和存儲在其中的數據的代理的類。您可以在代理上設置過濾器功能,並讓代理將其大部分其他功能委託給引用的ArrayCollection。你可以通過繼承ListCollectionView來做到這一點。

1

您可以使用原始數據創建單個數組,但在同一個數組上也有不同的ArrayCollections。因此,您可以將任何過濾器應用於ArrayCollections的實例。

作爲例子:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical" 
    creationComplete="init();"> 
<mx:Script> 
    <![CDATA[ 
    import mx.collections.ArrayCollection; 
    private var buffer:Array; 

    [Bindable] 
    private var listData1:ArrayCollection; 

    [Bindable] 
    private var listData2:ArrayCollection; 

    private function init():void 
    { 
    buffer = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 

    listData1 = new ArrayCollection(); 
    listData1.source = buffer; 

    listData2 = new ArrayCollection(); 
    listData2.source = buffer; 

    listData1.filterFunction = filter1 
    listData2.filterFunction = filter2; 

    listData1.refresh(); 
    listData2.refresh(); 
    } 

    private function filter1(item:Object):Boolean 
    { 
    var i:Number = Number(item); 

    if (i >= 5) 
    { 
    return true; 
    } 

    return false; 
    } 

    private function filter2(item:Object):Boolean 
    { 
    var i:Number = Number(item); 

    if (i <= 5) 
    { 
    return true; 
    } 

    return false; 
    } 
    ]]> 
</mx:Script> 
<mx:HBox> 
    <mx:List id="list1" 
    dataProvider="{listData1}"/> 
    <mx:List id="list2" 
    dataProvider="{listData2}"/> 
</mx:HBox> 
</mx:Application> 
1

我想有2種選擇:

  1. 不用擔心性能問題:即使你有多個集合,他們將都指向同一個數據對象通過引用。只需創建新的ArrayCollections並以數組形式傳入對象。然後,您可以將濾鏡應用於各個集合。

  2. 通過爲每個視圖應用一個過濾器,然後將結果複製到一個新的ArrayCollection中,熱切地處理這些過濾器。一旦過濾了一個集合,使用源filteredCollection.toArray()創建一個新集合。同樣適用於上述情況:集合將包含對象的引用,而不是值副本。

1

我有完全一樣的情況,並開發了這個工具:surflex。它允許選擇,過濾和加入收藏真快。