ZK的分页功能默认是在客户端做的,也就是服务器端返回所有的结果,然后客户端每次显示一页的数据,翻页的时候不提交请求到服务器端重新查询。如果服务器端返回的结果比较多,这种方案就不太好了,要实现服务器端的分页也很简单,在使用Listbox或者grid的时候不要使用mold="paging",而是添加一个Paging组件:
<paging id="groupListboxPaging" pageSize="10"/>
然后给Paging增加事件监听:
final Paging paging = getPaging(pagingName);
paging.addEventListener(
"onPaging", new EventListener()
{
public void onEvent(Event event)
{
PagingEvent pagingEvent = (PagingEvent) event;
int pageNumber = pagingEvent.getActivePage();
int firstRow = pageNumber * paging.getPageSize();
queryInfos.get(listName).getPageInfo().setFirstRow(firstRow);
refreshList(listName);
}
});
代码中的getPaging和refreshList都是我自定义的方法,getPaging很简单,因为我的这个代码是在自定义的Window类里面的,所以:
protected Paging getPaging(String pagingName)
{
return (Paging) getFellow(pagingName);
}
而refreshList就比较复杂一些了,根据传入的list的名字查询结果并刷新list:
public void refreshList(String name)
{
try
{
getListbox(getListboxName(name)).setModel(new BindingListModelList(list(name), false));
}
catch (Throwable t)
{
handleException(t);
}
}
核心就是拿到Listbox或者Grid然后setModel。