java—从网格中获取所有项,并在vaadin13中应用当前过滤器和排序

ctehm74n  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(261)

我正在尝试从网格中获取要导出的所有项。检索到的列表应该遵循所有应用的过滤器和排序。我用的是 ListDataProvider 如果有关系的话。
建议的解决方案包括:
使用 ListDataProvider.getItems() 或者 grid.getDataProvider().fetch(new Query<>()).collect(Collectors.toList()) (此处)
使用 grid.getDataCommunicator().fetchItemsWithRange(0,grid.getDataCommunicator().getDataProviderSize()) (这里和这里)
使用 grid.getDataCommunicator().fetchFromProvider(..) (此处)
缺点:
未对项目进行排序/筛选。
vaadin 8溶液,vaadin 13中不存在的方法。
提供的方法受保护,因此无法调用。
如何通过应用过滤器和排序从网格中实际获取所有项目?

dtcbnfnu

dtcbnfnu1#

既然你投了 grid.getDataProviderListDataProvider<Type> ,您可以从listdataprovider获取用于获取查询的当前筛选器。
但仅对查询使用筛选器将忽略排序顺序。要考虑到所有这些信息,您需要同时使用来自dataprovider(过滤信息)和datacommunicator(排序信息)的信息

ListDataProvider<Type> dataProvider = (ListDataProvider<Type>) grid.getDataProvider();
int totalSize = dataProvider.getItems().size();
DataCommunicator<Type> dataCommunicator = grid.getDataCommunicator();
Stream<Type> stream = dataProvider.fetch(new Query<>(
        0,
        totalSize,
        dataCommunicator.getBackEndSorting(),
        dataCommunicator.getInMemorySorting(),
        dataProvider.getFilter()));
List<Type> list = stream.collect(Collectors.toList());

编辑:你在回答中说,这感觉“黑客”。我明白你的意思,但这是办法。我认为这种行为可以作为网格本身的公共api提供: List<Type> list = grid.getCurrentItems(); . 然后网格会在内部执行此操作,这样您就不会看到“hacky”部分了。我确信他们知道当dataprovider不是 ListDataProvider . 您可以在github repo中为此打开一个功能请求

lskq00tm

lskq00tm2#

我找到了一个对我有用的解决办法。这不服从过滤,但排序,这是目前足以为我的情况。这看起来很有意思:

ListDataProvider<Type> dataProvider = (ListDataProvider<Type>) grid.getDataProvider();
int size = dataProvider.getItems().size();
DataCommunicator<Type> dataCommunicator = grid.getDataCommunicator();
Stream<Type> stream =
    dataProvider.fetch(
        new Query<Type, SerializablePredicate<Type>>(
            0,
            size,
            dataCommunicator.getBackEndSorting(),
            dataCommunicator.getInMemorySorting(),
            null));
List<Type> list = stream.collect(Collectors.toList());

我在这里看到的主要问题是
所有项目必须在( getItems().size() )获取实际查询的范围。
这个 getFilter() 方法 DataCommunicatorprotected 无法调用和检索筛选器(因此 null (=此处不使用过滤器)。

相关问题