まめ畑

ゆるゆると書いていきます

ArrayCollectionのソート

動的プロパティを使う際に注意すること - まめ畑でArrayCollectionを使っていたのですが、中のアイテムを指定したフィールドを基準にソートする方法。

private var _data:ArrayCollection = new ArrayCollection([
	{"piyo":"piyopiyo", "fuga":"fugafuga"},
	{"piyo":"hogehoge", "fuga":"puyopuyo"}
]);

の様に書く事が多かったため、

private var _data:ArrayCollection = new ArrayCollection([
	new fugaData("fuga", "piyo"),
	new fugaData("hoge", "puyo")
]);

の様にアイテムにインスタンスを渡した場合はどうしたらいいのか少し悩んだけど、ソートの方法は変わらないみたい。

//_dataがArrayCollection
//ソートオブジェクトを作る
var sortItem:Sort = new Sort();
//複数のフィールドを指定する時は sortItem.fields = [new SortField("piyo"), new SortField("fuga")]の様に追加するだけ
sortItem.fields = [new SortField("piyo", false, true, false)];
//アイテムを追加
_data.addItem(new fugaData("fuga", "piyo"));

//ソート方法を指定
_data.sort = sortItem;
//refresh()を呼ばないとソートされない
_data.refresh();

何も変わらなかったです。

ちなみに、SortFieldの引数は

第1引数 name:String (default = null) ― このフィールドが比較に使用するプロパティの名前です。 オブジェクトが単純型の場合、null を渡します。
第2引数 caseInsensitive:Boolean (default = false) ― ストリングをソートする場合は、値の大文字小文字を無視するかどうかをコンパレータに指示します。
第3引数 descending:Boolean (default = false) ― アイテムを降順に配置するかどうかをコンパレータに指示します。
第4引数 numeric:Object (default = null) ― ソートアイテムをアルファベット順ではなく数として比較するかどうかをコンパレータに指示します。


あと、勉強不足で知らなかったのですが、第4回Flex勉強会 - Fores Labs

レンダラーのインスタンスは、メモリの効率化のために実際に表示されている範囲の分だけしか作成されない。
そのため、スクロールすると以前に表示されていた部分のレンダラーのインスタンスが使い回されることになる。
レンダラーでスタイルを変更する場合は、必ず条件に合わない場合に元のスタイルに戻す処理も併せて記述しておかないと、関係のないデータまでスタイルが変更されてしまうという予期せぬ動作になることが多いので要注意。

と書かれていました。
いつも、何気なくスタイルを戻すようにはしていたのですが、こういう事だったのかと勉強になりました。