在Vaadin 8中,排序网格行就像单击列标题一样简单。这将按照here所述在升序和降序排序之间切换列。这通过grid.setItems()
方法填充网格时有效。
但是,当使用DataProvider
作为网格数据源时,单击列标题不会对行进行排序。
有关here描述的排序顺序的文档,DataProvider
,但有多个排序要求时处理排序顺序。
当我们填充grid.setItems()
时,是否有一种简单的方法可以简单地使用网格在填充grid.setDataProvider()
时展示的相同默认排序行为?
答案 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( “酒吧”);