読者です 読者をやめる 読者になる 読者になる

ListView スクロールで追加

Wicket の基本かも知れないが、、、
ListView で、リストが追加された時に、すべてのリスト要素に対する populateItem が実行されないように、
追加分だけ実行させるには、
  setReuseItems(true)
を、ListView で実行する。

確認の為のコード、サンプル。
スクロールが終端に達した時に、AJAX でリスト追加イベントを実行するもので確認
Ajaxイベントビヘビアを用意しておく。

public abstract class AjaxScrollEventBehavior extends AjaxEventBehavior{
   protected abstract void onScroll(AjaxRequestTarget target);
   public AjaxScrollEventBehavior(){
      super("scroll");
   }
   @Override
   protected void onEvent(AjaxRequestTarget target){
      onScroll(target);
   }
}

HTML...
<table class="scdata">
   <thead>
      <tr>
         <th>ID</th><th>Description</th>
      </tr>
   </thead>
   <tbody wicket:id="scrollbody" id="scrollbody">
      <tr wicket:id="listview" id="listview">
         <td wicket:id="seqno" id="seqno"></td>
         <td>ABCDEFGHIJKLMNOPQRSTUVWXYZ</td>
      </tr>
   </tbody>
</table>
<form wicket:id="form">
<button wicket:id="term" id="term"  type="button" style="display: none">AJAX</button>
</form>

読み込ませる JavaScript...
/**
 * ScrollEventPage.js
 */

var scrollsize = 0;
var scrollSetting = function(){
   if ( ($('#scrollbody').get(0).scrollHeight - $('#scrollbody').height()) == $('#scrollbody').scrollTop()){
      // スクロール終端に達した時の処理を行う。
      scrollsize = $('#scrollbody').get(0).scrollHeight;
      $('#term').trigger("click");
      setTimeout("$('#scrollbody').scrollTop("+scrollsize+");", 100);
   }
};

ページクラス。。。IntStream でリストを作ってる。。。
public class ScrollEventPage extends WebPage{
   Logger logger = LoggerFactory.getLogger(this.getClass());
   List<Integer> list;
   public ScrollEventPage(){
      list = IntStream.range(1, 20).boxed().collect(Collectors.toList());
      final WebMarkupContainer scrollbody = new WebMarkupContainer("scrollbody");
      scrollbody.add(new AjaxScrollEventBehavior(){
         @Override
         protected void onScroll(AjaxRequestTarget target){

            target.appendJavaScript("scrollSetting();");
         }
      }
);
      queue(scrollbody);

      queue(new ListView<Integer>("listview", list){
         @Override
         protected void populateItem(ListItem<Integer> item){
            Integer seq = item.getModelObject();
            item.add(new Label("seqno", seq.toString()));
            logger.debug("### populateItem seq = " + seq);
         }
      }.setReuseItems(true));

      queue(new Form<Void>("form"));
      queue(new AjaxButton("term"){
         @Override
         protected void onSubmit(AjaxRequestTarget target, Form<?> form){

            logger.debug("### term onSubmit ###");
            List<Integer> alist = IntStream.range(list.size()+1, list.size()+10).boxed().collect(Collectors.toList());
            list.addAll(alist);
            target.add(scrollbody);
         }
      }
);
   }
   @Override
   public void renderHead(IHeaderResponse response){
      super.renderHead(response);
      response.render(CssHeaderItem.forReference(new CssResourceReference(ScrollEventPage.class, "ScrollEventPage.css")));
      // scrollSetting() を定義してる JavaScript を読み込ませます。
      response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(ScrollEventPage.class, "ScrollEventPage.js")));
   }

}