我正在尝试使用wicket来显示来自nosql数据库的结果。这意味着大小未知的大型数据集。
我需要一种具有分页功能的GridView,DataProvider只依赖于迭代器和估计的结果大小(如100+,也可能意味着500k)。好的例子是谷歌搜索 - 分页最多10页,你可以一个接一个地跳,或者向前/向后跳几页。
有人知道这样的组件吗?
答案 0 :(得分:1)
我有一个非常类似的问题here。 BorisPavlović指出我可以使用像infinite scrolling这样的this解决方案。
但我仍然最终使用带有IDataProvider的常规DataView和默认的wicket ajax页面导航器。我将查询结果限制为~100(每页10个)并将结果缓存在IDataProvider中并使用列表中的size()。当size()返回与Maxresults(100)相同时,我发出警告,用户通常不会超越第2页(也像谷歌)。
答案 1 :(得分:1)
我对此类方法的处理如下(即使用常规DataProvider):
size()
时,我估计是否会有比[results per page]*[current page] + [max pages]*[results per page]
更多的结果;
[results per page] * ([current page] + [max pages]) - 1
这会让wicket认为在任何给定时间都有[current page] + [max pages]
页的价值。因此,在任何给定的点上,您只需要知道是否有更多[max pages]
个结果,而不是确切的结果数量。
size()
用于确定first
函数上的count
和iterator()
参数值,以及分页大小,因此它没有实际上是结果集的大小,它可以是一个值,表示你想要显示多少结果,并担心当你接近它时你想要显示多少结果。
然而,size()
的预期行为是显示结果的实际大小,因此应检查您在GridView上使用的任何其他组件或行为的副作用,因为它们可能会出现意外结果
答案 2 :(得分:1)
我无法找到这样的数据提供者的lib,所以我实现了一个 - 它被称为IterableGridView
以下是代码:https://github.com/maciejmiklas/cyclop/tree/master/cyclop-wicket-components
Iterable Grid View基于Wicket的GridView
,但它不适用于IDataProvider
但是
IterableDataProvider
。这个新的数据提供程序仅依赖于普通的java迭代器 - 不需要大小信息,也不需要为每个页面创建范围迭代器。
final List<String> myGridData = new ArrayList<>();
myGridData.add("value 1");
myGridData.add("value 2");
IterableDataProvider<String> iterableDataProvider = new IterableDataProvider<String>(10) {
@Override
protected Iterator<String> iterator() {
return myGridData.iterator();
}
@Override
public IModel<String> model(String s) {
return Model.of(s);
}
@Override
public void detach() {
}
};
IterableGridView<String> myGrid = new IterableGridView<String>("myGrid", iterableDataProvider) {
@Override
protected void populateEmptyItem(Item<String> item) {
item.add(new Label("myValue"));
}
@Override
protected void populateItem(Item<String> item) {
item.add(new Label("myValue", item.getModelObject()));
}
};
add(myGrid);
myGrid.setItemsPerPage(10);
// you have to use custom pager and not AjaxPagingNavigator
IterablePagingNavigator pager = new IterablePagingNavigator("rowNamesListPager", rowNamesList);
resultTable.add(pager);