gpt4 book ai didi

sorting - Vaadin 8 使用 DataProvider 时网格排序不起作用

转载 作者:行者123 更新时间:2023-12-02 16:28:49 25 4
gpt4 key购买 nike

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

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

有关于排序顺序的文档描述 hereDataProvider s 但在有多个排序要求时处理排序顺序。

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

最佳答案

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

DataProvider 的想法是将数据检索委托(delegate)给数据库等后端系统。例如,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 数据库:是的,这是首选方式。

关于sorting - Vaadin 8 使用 DataProvider 时网格排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46094071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com