阻止ArrayCollection不断排序(仅排序一次)

时间:2012-05-21 12:20:52

标签: actionscript-3 sorting flex air flex4.5

我有一个由ArrayCollection传播的列表,它保存了一个模型类的实例。 此模型类具有对包含股票值的字典的类引用。当然,这些价值会不断刷新。

当我将sort函数应用于ArrayCollection时,我确实得到了正确的排序,但是sort函数不断运行,但我需要它只运行一次。因此,排序应该在第一次对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;
    }
}

那么,有没有办法停止排序过程,而不是简单地在函数末尾放置一个布尔值来停止排序?这意味着每次更新值时都会调度该函数,这是一种非常不希望的行为。

1 个答案:

答案 0 :(得分:2)

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

然后应停止触发您的排序。它仍然不理想,b / c当你调用这个方法时,该集合显然会跟踪所有的变化,所以如果你以后调用enableAutoUpdate()它可以重放它们。

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