2010年7月30日金曜日

ActionScript3(Flex)でArrayCollectionのソート状態をソートなし状態にしてもソートを維持するには?

これはなかなか説明するのがムズカシイ。

ArrayCollectionはソートが可能だけど、ソートしたとしてもそれはあくまで見かけ(view)上の話で、ソースとなる配列が並びかえられたわけではない。だからソートを無効にすると、ソースとなる配列の並びのままが再現される。

では、ソートを無効しても現在のソート状態を維持するにはどうしたらよいか?

例えばこんな感じ。

var ac:ArrayCollection = new ArrayCollection();
ac.addItem("2");
ac.addItem("4");
ac.addItem("3");
ac.addItem("1");
trace("初期状態 ac=" + ac + " ac.sorce=" + ac.source);

ac.sort = new Sort();
ac.refresh();
trace("ソート有効 ac=" + ac + " ac.sorce=" + ac.source);

ac.source = ac.toArray(); //ソート状態の配列を取得してsourceとする
ac.sort = null;
ac.refresh();
trace("ソート無効 ac=" + ac + " ac.sorce=" + ac.source);

ポイントはac.toArray()を使ってソート状態の配列を取得してac.sourceにセットするところ。

refresh()を忘れないように注意。