0

我有一个由包含模型类实例的 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;
    }
}

那么,除了简单地在函数末尾放置一个布尔值来停止排序之外,还有其他方法可以停止排序过程吗?这意味着该函数仍会随着值的每次更新而被调度,这是一种相当不受欢迎的行为。

4

1 回答 1

2

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

这应该会停止触发您的排序。它仍然不理想,当您调用此方法时,集合显然会跟踪所有更改,因此如果您稍后调用enableAutoUpdate().

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

于 2012-05-21T16:41:44.960 回答