我正在尝试从网格中导出所有项目。检索到的列表应遵循所有应用的过滤器和排序。ListDataProvider如果重要的话我正在使用。
建议的解决方案包括:
ListDataProvider.getItems()或grid.getDataProvider().fetch(new Query<>()).collect(Collectors.toList())(此处)grid.getDataCommunicator().fetchItemsWithRange(0,grid.getDataCommunicator().getDataProviderSize())(此处和此处)grid.getDataCommunicator().fetchFromProvider(..)(此处)缺点:
如何通过应用过滤器和排序来实际获取网格中的所有项目?
由于您转换grid.getDataProvider为 a ListDataProvider<Type>,您可以从 ListDataProvider 获取当前过滤器以用于获取查询。
但仅使用 Filter 进行查询将忽略排序顺序。要考虑所有这些信息,您需要使用来自 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());
Run Code Online (Sandbox Code Playgroud)
编辑:你在回答中说这感觉“hacky”。我明白你的意思,但这就是这样做的方法。我认为这种行为可以作为网格本身的公共 api 提供:List<Type> list = grid.getCurrentItems();. 然后网格会在内部执行此操作,这样您自己就不会看到“hacky”部分。我确信当 dataprovider 不是 的实例时,他们知道如何执行相同的操作ListDataProvider。您可以在github 存储库中为此打开一个功能请求