我有一个由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;
}
}
那么,有没有办法停止排序过程,而不是简单地在函数末尾放置一个布尔值来停止排序?这意味着每次更新值时都会调度该函数,这是一种非常不希望的行为。
答案 0 :(得分:2)
Al_Birdy是对的,这是ListCollectionView
(ArrayCollection
扩展)的默认行为。 ListCollectionView
定义了一个名为disableAutoUpdate()
的方法,该方法将阻止在项目更改时由集合调度CollectionChange和PropertyChange事件。
然后应停止触发您的排序。它仍然不理想,b / c当你调用这个方法时,该集合显然会跟踪所有的变化,所以如果你以后调用enableAutoUpdate()
它可以重放它们。
要解决此问题,您可能只想自己对数据进行排序,然后使用已排序的数据创建ArrayCollection
。