4

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

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

这里有关于排序顺序的文档,用DataProviders 描述,但在有多个排序要求时处理排序顺序。

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

4

2 回答 2

6

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

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

那么你的实际数据源是什么?也许你可以分享你到目前为止所做的数据提供者代码。

编辑

摘自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 数据库:是的,这是首选方式。

于 2017-09-07T14:24:47.760 回答
1

我有同样的问题,我在帖子的评论中找到了解决方案

创建 new Grid<Foo>() 时,它与 new Grid<Foo>(Foo.class) 不同。

第二个也基于提供的类创建带有 sortProperties 的列。当您手动定义列时,您还应该定义 sortProperties。

grid.addColumn(Foo::getBar).setSortProperty("bar").setCaption("Bar");

于 2017-10-14T05:41:00.770 回答