2012-05-21 27 views
0

我有一个列表传播的ArrayCollection持有模型类的实例。 此模型类具有对包含库存值的字典的类引用。自然,这些价值不断刷新。停止ArrayCollection从不断排序(只排序一次)

当我将排序函数应用于ArrayCollection时,我确实得到了正确的排序,但排序函数不断运行,但我只需要它运行一次。所以排序应该在第一次排序ArrayCollection后立即停止。 (我正在为基于移动设备优化的基于列表的DataGrid工作,因此不断对ArrayCollection进行排序不仅不是必需的,而且还需要太多的性能),并且看起来像以下:

private function headerClick(event:MouseEvent):void { 

    sField = event.currentTarget.id;   
    var sort:Sort = new Sort(); 
    sort.compareFunction = fidSort; 

    (_list.dataProvider as ArrayCollection).sort = sort; 
    (_list.dataProvider as ArrayCollection).refresh(); 
} 

private function fidSort(a:Object, b:Object, fields:Array = null):int { 

    if(a.fidList.fidMap[sField].fieldValue == b.fidList.fidMap[sField].fieldValue) { 
     return 0; 
    } else if(a.fidList.fidMap[sField].fieldValue > b.fidList.fidMap[sField].fieldValue) { 
     return 1; 
    } else{ 
     return -1; 
    } 
} 

那么,有没有办法阻止不是简单地在函数结束把一个布尔值停止排序等排序的过程?这意味着该函数仍然会随着值的每次更新而分派,这是一种相当不希望的行为。

+0

您是否尝试过在刷新执行后将数组集合的排序属性设置为空? – bedwyr

+0

函数的持续运行是一种异常行为。不是吗?您是否尝试过点击后禁用按钮?可能是,按钮被按下两次或三次? –

+0

@bedwyr,是的,我试过了,虽然没有工作。将排序设置为空,然后刷新调用集将删除排序并将ArrayCollection设置回默认状态。如果不调用refresh(),那么排序仍然适用于每次更新。 – AlBirdie

回答

2

Al_Birdy是对的,这是ListCollectionView(其ArrayCollection扩展)的默认行为。 ListCollectionView定义了一个名为disableAutoUpdate()的方法,这将防止CollectionChange和PropertyChange事件在项目更改时由集合分派。

然后这应该停止触发你的排序。它仍然不理想,B/C集合显然会在您调用此方法时跟踪所有更改,因此如果稍后致电enableAutoUpdate(),它可以重播它们。

要解决此问题,您可能只想自己对数据进行排序,然后使用排序后的数据创建ArrayCollection

+0

不幸的是,'disableAutoUpdate()'可以防止我的'ArrayCollection'被更改它的项目值所更新。我猜想自己排序数据会是一个更好的方法,我只是想知道创建一个新的'ArrayCollection'是否理想。将这种排序直接应用于ArrayCollection(List)的源代码(恰好是'Array')不是更好吗? – AlBirdie

+0

为了回答我自己,直接在ArrayCollection的源代码中应用排序,但是即使在i7 2600机器上也是如此。我像这样使用它:'(_list.dataProvider as ArrayCollection).source.sort(fidSort);',以便直接调用我以前使用的函数,就是直接调用源'Array'。 – AlBirdie

+0

@Al_Birdy排序数组应该与排序ArrayCollection一样快或更快。在ArrayCollection用作List的dataProvider之前,您可以尝试进行排序吗?在List使用集合时进行排序可能会导致List做很多额外的工作。 IE浏览器。以这种方式排序可能会产生大量的CollectionEvent.COLLECTION_CHANGE事件(其中'kind'属性为CollectionEventKind.RESET)。 –