Adobe Air / Flex过滤大型数据集

时间:2009-09-30 04:12:26

标签: flex air

您好我有一个Air应用程序可下载大约100,000个对象的数据集,并将对象放入ArrayCollection中。

我想在整个应用程序的众多屏幕中对各种数据集应用各种过滤器。 如果我制作该系列的多个副本,我有点担心可能的性能问题。但是,如果我不复制该集合,任何应用的过滤器都将反映在所有屏幕中,这不是我需要的行为。

提供此大型数据收集的多个视图的最佳方法是什么? 有没有人有这种情况的经验。 任何帮助非常感谢。

4 个答案:

答案 0 :(得分:1)

您可以使用一个类作为原始ArrayCollection的代理以及存储在其中的数据。您可以在代理上设置过滤器功能,并让代理将其大多数其他功能委托给引用的ArrayCollection。您可以从继承ListCollectionView开始执行此操作。

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

答案 2 :(得分:1)

我猜有两种选择:

  1. 不要担心性能:即使您有多个集合,它们也都会通过引用指向相同的数据对象。只需创建新的ArrayCollections并将对象作为数组传递。然后,您可以将过滤器应用于各个集合。

  2. 通过为每个视图应用过滤器来急切处理过滤器,然后将结果复制到新的ArrayCollection中。过滤集合后,使用filteredCollection.toArray()作为源创建一个新集合。这同样适用于上述:集合将包含对象的引用,而不是值副本。

答案 3 :(得分:1)

我有完全相同的情况并开发了这个工具:surflex。它允许非常快速地选择,过滤和加入集合。