我有一个ArrayCollection
作为列表的dataProvider。
该集合存储MyObject
类型的对象:
public class MyObject {
public var myMap:Dictionary;
}
myMap
存储键值对,键为integer
,值为字符串。
目前为止的约束。我现在要做的是根据地图的字段对集合进行排序。
使用ArrayCollection
的{{1}}功能和我自己的sort
确实有效。这就是我实现它的方式:
compareFunction
正如我所说,这确实有助于排序。但是,自然排序(作为集合的属性)保留在集合上,除非明确地从中删除,这意味着每次 var key:int = 15;
var sort:Sort = new Sort();
sort.compareFunction = fidSort;
myCollection.sort = sort;
myCollection.refresh();
private function fidSort(a:Object, b:Object, fields:Array = null):int {
if(a.myMap[key].fieldValue == b.myMap[key].fieldValue) {
return 0;
} else if(a.myMap[key].fieldValue > b.myMap[key].fieldValue) {
return 1;
} else{
return -1;
}
}
映射中的值发生更改时,它都将根据比较函数进行排序。 / p>
我需要的是完全应用排序一次,之后使用地图值发生的事情不应该改变集合排序。
我已经尝试过在集合上禁用autoupdate之类的东西(当然,这不会起作用,因为集合不再获得任何更新(确实如此,但它们仅被缓存))。
之后我读了this关于排序底层数组的帖子。
但是,这似乎不适用于地图,因为我收到编译错误,指出在MyObject
上找不到myMap[key].fieldValue
。
所以是的,我有点迷失在太空中。如果有人知道如何实现这个,非常基本的任务,请告诉我。
干杯!
答案 0 :(得分:2)
知道了,为了完整,我想自己回答这个问题。
如前所述,使用myCollection.toArray().sort(fidSort)
并不完全有效。在这一步骤中制作的数组确实已经排序,但是,即使调用refresh()
,该集合也没有得到排序。
要解决此问题,我们需要直接使用集合的源(当然是数组)并对该数组进行排序,而不是从集合中创建新数组;
collection.source.sort(fidSort);
collection.refresh();
由于我们仍然只是对数组进行排序而没有将Sort
应用于集合本身,因此该集合只对其进行一次排序,而不管对其数据的更新。
编辑:只是为了解决问题,在对collection
的基础数组进行排序时,无法立即恢复原始项目位置,就像在ArrayCollection
上应用排序时一样直接并将其设置为null以恢复位置。
简单的解决方案是预先缓存数组项索引。