您好我有一个Air应用程序可下载大约100,000个对象的数据集,并将对象放入ArrayCollection中。
我想在整个应用程序的众多屏幕中对各种数据集应用各种过滤器。 如果我制作该系列的多个副本,我有点担心可能的性能问题。但是,如果我不复制该集合,任何应用的过滤器都将反映在所有屏幕中,这不是我需要的行为。
提供此大型数据收集的多个视图的最佳方法是什么? 有没有人有这种情况的经验。 任何帮助非常感谢。
答案 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)
我猜有两种选择:
不要担心性能:即使您有多个集合,它们也都会通过引用指向相同的数据对象。只需创建新的ArrayCollections并将对象作为数组传递。然后,您可以将过滤器应用于各个集合。
通过为每个视图应用过滤器来急切处理过滤器,然后将结果复制到新的ArrayCollection中。过滤集合后,使用filteredCollection.toArray()作为源创建一个新集合。这同样适用于上述:集合将包含对象的引用,而不是值副本。
答案 3 :(得分:1)
我有完全相同的情况并开发了这个工具:surflex。它允许非常快速地选择,过滤和加入集合。