【问题标题】:Stop ArrayCollection from being constantly sorted (sort only once)停止 ArrayCollection 不断排序(仅排序一次)
【发布时间】:2012-05-21 12:20:51
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试在刷新执行后将数组集合的排序属性设置为空?
  • 函数的持续运行是异常行为。不是吗?您是否尝试在单击后禁用该按钮。可能是这样,按钮被按下了两次或三次?
  • @bedwyr,是的,我试过了,但没用。将排序设置为 null 然后刷新调用设置会删除排序并将 ArrayCollection 设置回其默认状态。在不调用 refresh() 的情况下,排序仍然适用于每次更新。
  • @Vishwas Gagrani,这根本不是异常,而不是实现排序方式的默认行为。一旦 ArrayCollection 得到更新,它将被排序以防设置排序。

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


【解决方案1】:

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

这应该会停止触发您的排序。仍然不理想,b/c 集合显然会在您调用此方法时跟踪所有更改,因此如果您稍后调用 enableAutoUpdate(),它可以重播它们。

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

【讨论】:

  • 不幸的是,disableAutoUpdate() 也阻止了我的ArrayCollection 被其项目的更改值更新。我想我自己对数据进行排序会是一种更好的方法,我只是想知道创建一个新的ArrayCollection 是否理想。将排序直接应用于ArrayCollection(List) 的源(恰好是Array)不是更好吗?
  • 回答我自己,直接在 ArrayCollection 的源代码上应用排序,但需要很长时间,即使在 i7 2600 机器上也是如此。我是这样使用它的:(_list.dataProvider as ArrayCollection).source.sort(fidSort);,来调用我之前使用的函数,只是这次直接在源Array上。
  • @Al_Birdy 排序 Array 应该与排序 ArrayCollection 一样快或更快。您可以尝试在将 ArrayCollection 用作列表的数据提供者之前进行排序吗?在 List 使用集合时进行排序可能会导致 List 做很多额外的工作。 IE。以这种方式排序可能会生成很多 CollectionEvent.COLLECTION_CHANGE 事件(其中kind 属性是 CollectionEventKind.RESET)。
  • 我也是这么想的,所以我觉得这个结果很奇怪。不幸的是,我需要在运行时进行排序,因为用户必须能够通过各种参数对集合进行排序。但是,我发现 Christophe Herreman 已经实现了一个非常相似的组件(基于列表的 DataGrid),它已经支持排序。我会调查一下并在调查后报告。
  • 我应该早点提到这一点:也许你可以尝试在排序之前调用disableAutoUpdate(),然后在排序之后调用enableAutoUpdte()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
相关资源
最近更新 更多