Vaadin 23.3.0中如何统一获取Grid当前显示元素数量?
在Vaadin 23.3.0中统一获取Grid过滤/排序后的元素数量
Vaadin 23.3.0的Grid可以通过统一方式获取过滤、排序后的元素总数量,无需区分内存内过滤或懒加载场景,核心是结合DataProviderAPI与Grid当前的过滤、排序条件:
统一实现步骤
- 获取Grid关联的
DataProvider实例 - 基于Grid当前的过滤条件、排序规则创建
Query对象 - 调用
DataProvider.size(query)得到最终数量
示例代码:
// 假设Grid泛型类型为YourEntity,过滤条件类型根据实际场景调整(无自定义过滤可使用Void) DataProvider<YourEntity, ?> dataProvider = grid.getDataProvider(); // 构造包含当前过滤与排序规则的Query Query<YourEntity, ?> query = new Query<>( null, grid.getFilter(), grid.getSortOrder() ); // 获取过滤排序后的总元素数量 long filteredCount = dataProvider.size(query);
两种场景的适配说明
内存内过滤(如ListDataProvider):
ListDataProvider会自动处理Query中的过滤、排序逻辑,size(query)直接返回内存中经过筛选、排序后的元素总数,无需额外开发。懒加载(如CallbackDataProvider):
只要在实现CallbackDataProvider的sizeCallback时,正确接收Query参数里的过滤条件与排序规则,并以此为依据查询数据库的匹配记录数,size(query)就会返回数据库中符合条件的总条数。示例实现:CallbackDataProvider<YourEntity, String> lazyDataProvider = CallbackDataProvider.fromFilteringCallbacks( // 分页数据加载回调 query -> { // 根据query的过滤、排序、偏移量、条数参数查询数据库 return yourRepository.findFiltered(query.getFilter(), query.getSortOrders(), query.getOffset(), query.getLimit()).stream(); }, // 总数量统计回调 query -> { // 根据query的过滤条件统计数据库匹配记录数 return yourRepository.countFiltered(query.getFilter()); } ); grid.setDataProvider(lazyDataProvider);
注意事项
- 如果使用外部组件(如TextField)做过滤,需确保过滤条件已通过
grid.setFilter()方法正确设置,这样grid.getFilter()才能获取到当前生效的规则。 - 若无需排序逻辑,直接传入
grid.getSortOrder()即可,DataProvider会自动忽略无关参数。
内容的提问来源于stack exchange,提问作者saleksand
相关产品推荐
相关产品推荐

