如何将Vaadin的CallbackDataProvider<Object, Void>转换为ListDataProvider<Object>
问题原因
CallbackDataProvider 和 ListDataProvider 是Vaadin中DataProvider接口的两个平级实现类,没有继承关系,因此完全不支持直接强制转换,你遇到的ClassCastException属于预期内的正常报错。PaginatedGrid默认内部封装的是内存List数据源,因此返回的是ListDataProvider实例,普通Grid不会做这个默认转换。
可行的解决方法
- 方案1:如果你的数据源本身就是全量内存列表,直接弃用
CallbackDataProvider,初始化时直接构造ListDataProvider绑定到Grid,后续取值直接强转不会报错,是成本最低的方案。 - 方案2:如果必须使用
CallbackDataProvider(比如对接后端分页接口、数据量很大不需要全量加载),不需要转成ListDataProvider也能实现过滤:- 提前定义一个变量存储TextField的搜索值,比如
String searchKey = ""; - 重构
CallbackDataProvider的查询逻辑,在fetch、count方法里都加上searchKey的过滤判断 - 在
TextField的值变更监听中,更新searchKey的取值后调用dataProvider.refreshAll()即可触发重新查询,实现过滤效果
- 提前定义一个变量存储TextField的搜索值,比如
- 方案3:如果一定要得到
ListDataProvider实例,可以主动拉取全量数据转换,仅适合数据量小的场景:// 从Grid拿到原始CallbackDataProvider CallbackDataProvider<Object, Void> callbackProvider = (CallbackDataProvider<Object, Void>) grid.getDataProvider(); // 拉取全量数据,注意查询参数要覆盖所有数据范围 List<Object> allItems = callbackProvider.fetch(Query.ofAll()).collect(Collectors.toList()); // 构造ListDataProvider重新绑定到Grid ListDataProvider<Object> listProvider = new ListDataProvider<>(allItems); grid.setDataProvider(listProvider);
内容的提问来源于stack exchange,提问作者Sk Monjurul Haque
相关产品推荐
相关产品推荐

