0

ArrayCollectionリストのdataProviderとして機能するを持っています。

コレクションには、次のタイプのオブジェクトが格納されますMyObject

public class MyObject {
    public var myMap:Dictionary;
}

myMapキーと値のペアを格納します。キーはintegerで、値は文字列です。

これまでのところ、制約についてです。私が今やりたいのは、マップのフィールドに基づいてコレクションを並べ替えることです。

自分の関数でArrayCollection's関数を使用すると機能します。これが私がそれを実装した方法です:sortcompareFunction

    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;
        }
    }

私が言ったように、それはソートのために機能します。ただし、当然、(コレクションのプロパティである)並べ替えは、コレクションから特に削除されない限り、コレクションに残ります。つまり、マップ内の値がMyObject変更されるたびに、compare関数に従って並べ替えられます。

必要なのは、並べ替えを1回だけ適用することです。その後、マップ値で何が起こっても、コレクションの並べ替えは変更されません。

コレクションの自動更新を無効にするなどの方法を試しました(コレクションが更新を取得しなくなるため、当然機能しません(ただし、キャッシュされるだけです))。その後、基になる配列のソートに関するこの投稿を読みました。myMap[key].fieldValueただし、で見つからなかったというコンパイルエラーが発生するため、マップでは機能しないようですMyObject

そうです、私はここの宇宙でちょっと迷っています。誰かがこれを達成する方法の手がかりを持っているなら、本当に非常に基本的なタスクです、私に知らせてください。

乾杯!

4

1 に答える 1

2

了解しました。完全を期すために、この質問に自分で回答したいと思います。

前に述べたように、使用myCollection.toArray().sort(fidSort)は完全には機能しませんでした。このステップで作成された配列は実際に並べ替えられていますが、コレクションはrefresh()呼び出されても並べ替えられませんでした。

これを修正するには、コレクションから新しい配列を作成する代わりに、コレクションのソース(もちろん配列)を直接使用して、その配列を並べ替える必要があります。

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

まだ配列を並べ替えているだけでSort、コレクション自体には適用されていないため、データの更新に関係なく、コレクションは1回だけ並べ替えられます。

編集:キックのためだけに、元のアイテムの位置を復元することは、直接に並べ替えを適用し、それをnullに設定して位置を復元するcollection場合のように、基になる配列を並べ替えるときにすぐに使用することはできません。ArrayCollection簡単な解決策は、配列アイテムのインデックスを事前にキャッシュすることです。

于 2012-11-16T08:33:09.733 に答える