リストボックスは直接リスト項目をソーティングすることをサポートします。特定の行のソーティングを可能にする方法はいくつかあります。
一番簡単な方法は以下のようにautoにリストヘッダーのsortプロパティを設定することです。リストヘッダーに関連している行は指定された行のリストセルごとのラベルを基にしてソート可能です。
<zk> <listbox width="200px"> <listhead> <listheader label="name" sort="auto"/> <listheader label="gender" sort="auto"/> </listhead> <listitem> <listcell label="Mary"/> <listcell label="FEMALE"/> </listitem> <listitem> <listcell label="John"/> <listcell label="MALE"/> </listitem> <listitem> <listcell label="Jane"/> <listcell label="FEMALE"/> </listitem> <listitem> <listcell label="Henry"/> <listcell label="MALE"/> </listitem> </listbox> </zk>
異なった方法でリスト項目をソートするなら、java.util.ComparatorインスタンスをsortAscending、sortDescendingプロパティの両方又はどちらかに指定します。一度指定すると、リスト項目はascending、descendingの両方か、又はどちらかに指定したコンペアレーターを使用して記憶されます。
a utoを伴ったsortプロパティの起動は自動的にsortAscendingとsortDescendingに二つのコンペアレーターを指定します。それに他のコンペアレーターを指定することでオーバーライドできます。
例えば、リストセルのラベルではなくて、リスト項目の値を基にしてソートすることを想定します。以下のように、listitemComparatorのインスタンスをこれらのプロパティに指定します。
<zscript> Comparator asc = new ListitemComarator(-1, true, true); Comparator dsc = new ListitemComarator(-1, false, true); </zscript> <listbox> <listhead> <listheader sortAscending="${asc}" sortDescending="${dsc}"/> ...
sortDirectionプロパティはクライアントで特定の行の列の項目を表示するかどうかを決めます。リスト項目がリストボックスに追加される前に記録されるなら、このプロパティを明示的に設定すべきです。
<listheader sortDirection="ascending"/>
そのため、リストヘッダーにコンペアレーターを指定する限り、リストボックスに自動的に保存されます。
リストヘッダーに少なくとも一つコンペアレーターを指定するとき、ユーザーがクリックした場合、onSortイベントがサーバーへ送信されます。リストヘッダーはリスナを実装して、ソーティングを自動的に操作します。
手動で制御するなら、onSortイベントが送信されるときのためにリストヘッダーにリスナを追加できます。デフォルトリスナにsortメソッドを呼び出させないために、イベントが受信されたときのためにstopPropagationメソッドを呼び出さなければなりません。代わりに、以下に示すようにsortメソッドをオーバーライドできます。
sortメソッドはデフォルトのonSortイベントリスナ用の実装です。Javaコードでリスト項目をソートしたい場合に便利です。例えば、項目が追加された後に(適切な順番で無い場合を想定します)このメソッドを呼び出します。
new Listem("New Stuff").setParent(listbox); if (!"natural".header.getSortDirection()) header.sort("ascending".equals(header.getSortDirection()));
デフォルトのソーティングアルゴリズムはquick-sortです(org.zkoss.zk.ui.Componentsクラスのsortメソッドを使用します)。自身の実装でオーバーライドまたは前のセクションで説明したようにonSortイベントを監視することができます。
【ヒント】: 多量なライブデータのソーティングはパフォーマンスを著しく低下させるかもしれません。onSortイベント、又はsortメソッドを中断し、効率的に処理させるほうがいいでしょう。以下のSort Live Dataセクションをご覧ください。