寻找仅适用于迭代器的Wicket转发器(不知道确切的结果大小)

时间:2014-05-13 21:24:10

标签: wicket

我正在尝试使用wicket来显示来自nosql数据库的结果。这意味着大小未知的大型数据集。

我需要一种具有分页功能的GridView,DataProvider只依赖于迭代器和估计的结果大小(如100+,也可能意味着500k)。好的例子是谷歌搜索 - 分页最多10页,你可以一个接一个地跳,或者向前/向后跳几页。

有人知道这样的组件吗?

3 个答案:

答案 0 :(得分:1)

我有一个非常类似的问题here。 BorisPavlović指出我可以使用像infinite scrolling这样的this解决方案。

但我仍然最终使用带有IDataProvider的常规DataView和默认的wicket ajax页面导航器。我将查询结果限制为~100(每页10个)并将结果缓存在IDataProvider中并使用列表中的size()。当size()返回与Maxresults(100)相同时,我发出警告,用户通常不会超越第2页(也像谷歌)。

答案 1 :(得分:1)

我对此类方法的处理如下(即使用常规DataProvider):

  1. 确定最大显示页数(因此在Google示例中,这将是10页)
  2. 每当调用size()时,我估计是否会有比[results per page]*[current page] + [max pages]*[results per page]更多的结果;
    • 如果是,则返回[results per page] * ([current page] + [max pages]) - 1
    • 否则返回确切的金额
  3. 这会让wicket认为在任何给定时间都有[current page] + [max pages]页的价值。因此,在任何给定的点上,您只需要知道是否有更多[max pages]个结果,而不是确切的结果数量。

    size()用于确定first函数上的countiterator()参数值,以及分页大小,因此它没有实际上是结果集的大小,它可以是一个值,表示你想要显示多少结果,并担心当你接近它时你想要显示多少结果。

    然而,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);