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")));
}
}