Atsushi Kanaya
todoa****@gmail*****
2009年 2月 4日 (水) 18:26:40 JST
金谷(todogzm)です。 フィルタリングによって件数が減っていくリストに対するページング処理で ハマリ中ですので、アドバイスなどをいただけると非常に助かります。 現在、DataView, IDataProvider, 自作PagingNavigator(単に1,2,3,...のリンクを取り除いた実装)を用い、 フィルタリングによって件数が減っていくリストに対するページング処理を行おうとしています。 以下のようなイメージで、dao.getNext(count)するたびに、daoの内部ではフィルタリング処理が入り、 実際に取得できる件数が減少していきます。 class FilteringDataProvider implements IDataProvider { private FilteringDao dao; //取得できる結果件数、次/前のcount件リスト、結果の先頭か/結果の末尾かが取得可能 private int prevFirst; public Iterator iterator(int first, int count) { //今のfirstの値と以前のfirstの値から次のcount件か前のcount件か取る。 //次のcount件を取り、イテレータを返す処理。 Iterator iter = dao.getNext(count).iterator(); return iter; } public int size() { //サイズは上記のdao.getNext(count); を呼ぶたびに変化(減少)する。 return dao.size(); } //他メソッドは省略 } 実際にはDataView, PagingNavigator共にリストの値が減少していくような処理は想定されておりませんので、 もう次のcount件はないにも関わらず、空のページング部分が出てきてしまいます。 対策として、まずは以下を行いました。 ・PagingNavigatorで使われるPagingNavigationIncrementLinkのサブクラスを作り、 isFirst(), isLast()の値をdaoから取得する → 必要以上にページングできない対策 ただ、それだけではダメで、具体的には以下の2点がダメのようです。 ・DataViewがIDataProvider#size()を初回しか呼ばないため、減少していく件数が分からない ・DataView#onBeforeRender() あたりで現在の件数を通知しようにも該当メソッドがない というところで躓いてしまい、またもWicket-jaの皆様のお知恵を拝借させていただこうと メールさせていただいた次第です。 多分、DataView#onBeforeRender()で現在の件数をDataViewに通知できさえすれば 道は開けそうな気がするのですが、方法はありますでしょうか? 大したサンプルも用意できずにメールしてしまって申し訳ありません。 必要あらば用意したいと考えております。 以上、よろしくお願いします。