AS3 / Flex仅对ArrayCollection应用排序一次

时间:2012-11-15 17:57:16

标签: actionscript-3 flex sorting air flex4

我有一个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

所以是的,我有点迷失在太空中。如果有人知道如何实现这个,非常基本的任务,请告诉我。

干杯!

1 个答案:

答案 0 :(得分:2)

知道了,为了完整,我想自己回答这个问题。

如前所述,使用myCollection.toArray().sort(fidSort)并不完全有效。在这一步骤中制作的数组确实已经排序,但是,即使调用refresh(),该集合也没有得到排序。

要解决此问题,我们需要直接使用集合的源(当然是数组)并对该数组进行排序,而不是从集合中创建新数组;

  collection.source.sort(fidSort);
  collection.refresh();

由于我们仍然只是对数组进行排序而没有将Sort应用于集合本身,因此该集合只对其进行一次排序,而不管对其数据的更新。

编辑:只是为了解决问题,在对collection的基础数组进行排序时,无法立即恢复原始项目位置,就像在ArrayCollection上应用排序时一样直接并将其设置为null以恢复位置。 简单的解决方案是预先缓存数组项索引。