グリッド[41]のようにリストボックスはライブデータをサポートしています。ライブデータを使うと、開発者はビューからデータを分けます。
つまり開発者の仕事は、直接リストボックスを処理することより、むしろorg.zkoss.zul.ListModelインターフェースを実装することによる、データ供給だけが必要となります。利点は2つあります。
簡単に異なったビューで同じデータセットを表示することができます。
グリッドはデータを参照可能な(visible)場合にのみクライアントに送信します。データ量が大きい場合にネットワークの通信量が増えることを防ぎます。
ライブデータを使用する三つのステップがあります。
ListModelのフォーム中でデータを準備します。ZKではオブジェクト群を表示するためにorg.zkoss.zul.SimpleListModelと呼ばれる具体的な実装があります。
データの項目をレンダリングしリストボックスのリスト項目へ表示するためにorg.zkoss.zul.ListitemRendererインターフェースを実装します。
これは指定するか選択できます、指定されていないなら、デフォルトのレンダラーはデータを読み込み、最初の行へ入れます。
異なったビューの中では同じデータをあらわすのに、異なったレンダラーを実装できます。
modelプロパティ中にデータを指定します。オプションとして、itemRendererプロパティにレンダラーを指定します。
以下の例ではstrsetと呼ばれるリストモデルを準備しますmodelプロパティを通してそれをリストボックスに指定します。そのため、リストボックスは残りの作業を全部代わりに実行してくれます。
<window title="Livedata Demo" border="normal"><zscript>String[] data = new String[30];for(int j=0; j < data.length; ++j) {data[j] = "option "+j;}ListModel strset = new SimpleListModel(data);</zscript><listbox width="200px" rows="10" model="${strset}"><listhead><listheader label="Load on demend"/></listhead></listbox></window>
ライブデータが使用できるリストボックスをソート可能にするなら、org.zkoss.zul.ListModelに加えて、org.zkoss.zul.ListModelExtインターフェースを実装しなければなりません。
class MyListModel implements ListModel, ListModelExt { public void sort(Comparator cmpr, boolean ascending) { //do the real sorting //notify the listbox (or grid) that data is changed by use of ListDataEvent } }
ユーザーがリストボックスにソート要求するとき、リストボックスはListModelExtのsortメソッドを呼び出し、データをソートします。リストボックスよりむしろ、リストモデルによってソーティングは行われます。
ソート後は、(addListDataListenerメソッドにより) リストボックスに記憶されたorg.zkoss.zul.event.ListDataListenerインスタンスのonChangeメソッドを呼び出すことより、リストモデルはリストボックスに通知します。ほとんどの場合全データはたいてい変更され、リストモデルは以下のイベントを送信します。
new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, -1, -1)
メモ:ListModelとListModelExtの実装は視覚表現に依存しません。つまり、グリッド、リストボックス、ListModelをサポートしている他のコンポーネントと共にそれらは使用されます。
つまり、柔軟性を高めるにはコンポーネントを使用することは想定すべきではないです。むしろ、ListDataEventを使用して通信します。