使用DataProvider

时间:2017-09-07 10:29:37

标签: sorting vaadin8 vaadin-grid

在Vaadin 8中,排序网格行就像单击列标题一样简单。这将按照here所述在升序和降序排序之间切换列。这通过grid.setItems()方法填充网格时有效。

但是,当使用DataProvider作为网格数据源时,单击列标题不会对行进行排序。

有关here描述的排序顺序的文档,DataProvider,但有多个排序要求时处理排序顺序。

当我们填充grid.setItems()时,是否有一种简单的方法可以简单地使用网格在填充grid.setDataProvider()时展示的相同默认排序行为?

2 个答案:

答案 0 :(得分:6)

答案是否定的,否则它就没有多大意义。 grid.setItems方法在内部创建ListDataProvider,这是一个内存数据提供程序。因为它将所有数据保存在列表中,所以它可以使用比较器(来自网格列定义或提供给列表数据提供程序)轻松地对数据进行排序。因此,Vaadin只能在您将所有数据保存在内存中时帮助您进行排序。如果你有大量的行(例如一百万),这是低效的,因为你有很多内存和CPU消耗。这是您的自定义数据提供者的用武之地。

DataProvider的想法是将数据检索委托给像数据库这样的后端系统。例如,SQL数据库允许指定" ORDER BY" SQL查询中的子句,可用于通过后端对数据进行排序。假设您已应用正确的索引,数据库本身在资源消耗方面非常有效。

那么您的实际数据来源是什么?也许您可以共享您迄今为止所做的数据提供商代码。

修改

摘录自ListDataProvider

@Override
public Stream<T> fetch(Query<T, SerializablePredicate<T>> query) {
    Stream<T> stream = getFilteredStream(query);

    Optional<Comparator<T>> comparing = Stream
            .of(query.getInMemorySorting(), sortOrder)
            .filter(c -> c != null)
            .reduce((c1, c2) -> c1.thenComparing(c2));

    if (comparing.isPresent()) {
        stream = stream.sorted(comparing.get());
    }

    return stream.skip(query.getOffset()).limit(query.getLimit());
}

@Override
public int size(Query<T, SerializablePredicate<T>> query) {
    return (int) getFilteredStream(query).count();
}

要从评论中回答您的问题:是的,ListDataProvider会按照您的源代码中的说明进行排序。使用您的SQL数据库:是的,这是首选方式。

答案 1 :(得分:1)

我遇到了同样的问题,我在post

的comentaries中找到了解决方案
  

创建新的Grid&lt; Foo&gt;()时,它与new不同   网格和LT;富&GT;(让Foo.class)

     

第二个也使用sortProperties创建列   提供课程。当你手动定义列时,你应该定义   还有sortProperties。

     

grid.addColumn(富:: getBar).setSortProperty( “条”)setCaption( “酒吧”);