リストボックスのように、グリッドはライブデータをサポートします。ライブデータを使うと、開発者はビューからデータを分けることができます。つまり、開発者はグリッドを直接処理することよりむしろ、org.zkoss.zul.ListModelインターフェースを実装し、データを提供するだけが必要になります。その利点は二つあります。
簡単に異なったビューで同じデータセットを示すことができます。
グリッドはデータを参照可能な(visible)場合にのみクライアントに送信します。データ量が大きい場合にネットワークの通信量が増えることを防ぎます。
ライブデータを使用するには三つのステップがあります。
ListModelの形のデータを準備します。ZKではオブジェクト群を表すためのorg.zkoss.zul.SimpleListModelと呼ばれる具体的な実装があります。
データ列をグリッドにレンダリングするためにorg.zkoss.zul.RowRendererインターフェースを実装します。
これはオプションです。指定されなかった場合は最初のデータを行にレンダリングするのにデフォルトレンダラーが使用されます。
データを違ったビューで見せるには、異なったレンダラーを実装することもできます。
データをmodelプロパティの中に指定します。必要な場合はrowRendererプロパティ中にレンダラーを指定します。
以下の例中では、strsetと呼ばれるリストモデルを準備し、modelプロパティを使って、グリッドに指定します。そうしてグリッドは残りの作業を行ってくれます。
<window title="Live Grid" 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> <grid width="100px" height="100px" model="${strset}"> <columns> <column label="options"/> </columns> </grid> </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 grid (or listbox) 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)