[Wicket-ja-user 295] Re: フィルタリングによって件数が減っていくリストに対する繰り返し処理

Back to archive index

Atsushi Kanaya todoa****@gmail*****
2009年 2月 6日 (金) 09:30:24 JST


金谷(todogzm)です。

何とか自己解決することができました。
結局のところ、最初のメールに書きました、以下の項目だけで解決することができました。
実はdao部分に不具合があったという何ともお間抜けな結論でした…。

> ・PagingNavigatorで使われるPagingNavigationIncrementLinkのサブクラスを作り、
> isFirst(), isLast()の値をdaoから取得する → 必要以上にページングできない対策


以下の件は、IDataProvider#size()はPagingNavigatorの 1 2 3 ... のページングが
必要な場合には関係あるのかもしれませんが、今回の私のケースのように、
次/前のN件だけに対応できれば良い場合は、考慮しなくてよさそうでした。

> ただ、それだけではダメで、具体的には以下の2点がダメのようです。
> ・DataViewがIDataProvider#size()を初回しか呼ばないため、減少していく件数が分からない
> ・DataView#onBeforeRender() あたりで現在の件数を通知しようにも該当メソッドがない

大変お騒がせしましたが、メールを書くことで自分の頭の中も整理することができ、
フィルタリング対応ページングも何とか作成することができました。

以上です。


2009/02/04 18:26 Atsushi Kanaya <todoa****@gmail*****>:
> 金谷(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に通知できさえすれば
> 道は開けそうな気がするのですが、方法はありますでしょうか?
>
> 大したサンプルも用意できずにメールしてしまって申し訳ありません。
> 必要あらば用意したいと考えております。
>
> 以上、よろしくお願いします。
>




Wicket-ja-user メーリングリストの案内
Back to archive index