【问题标题】:is there any way to convert vaadin CallbackDataProvider<Object, Void> to ListDataProvider<Object>有什么方法可以将 vaadin CallbackDataProvider<Object, Void> 转换为 ListDataProvider<Object>
【发布时间】:2022-01-06 14:21:43
【问题描述】:
我正在使用CallbackDataProvider<Object, Void> dataprovider,然后使用grid.setDataProvider 在grid 中设置dataprovider。
然后在TextFieldaddValueChangeListener 方法中,我试图调用grid.getDataProvider(),它返回给我CallbackDataProvider 实例。
之后,我尝试输入ListDataProvider 进行过滤,其中我得到ClassCastException 但是当我使用PaginatedGrid 时,getDataProvider 正在返回ListDataProvider 实例。
这里不想用PaginatedGrid,有什么办法可以把CallBackDataProvider转换成ListDataProvider用Grid?
【问题讨论】:
标签:
spring
spring-boot
vaadin
vaadin-grid
【解决方案1】:
要回答您的字面问题,不,您不能将 CallbackDataProvider 转换为 ListDataProvider。您的根本问题在此处的两行之间说明:
我正在尝试使用 ListDataProvider 进行过滤
所以你的问题是你想过滤数据,但 CallbackDataProvider 没有为它提供与 ListDataProvider 类似的方法。这是有原因的 - ListDataProvider 将其所有项目存储在 Java 集合内的内存中,因此过滤支持集合很简单。 CallbackDataProvider 是延迟加载的,不知道在哪里完整的项目集,所以你需要自己实现对支持数据源的过滤。
要过滤延迟加载的 DataProvider,您需要一个 ConfigurableFilterDataProvider。首先,您需要使用DataProvider.fromFilteringCallbacks,而不是使用DataProvider.fromCallbacks 创建您的CallbackDataProvider。这使您能够使用query 对象的filter,并且您可以根据需要实现对后端数据的过滤。其次,您需要使用 dataProvider.withConfigurableFilter 将 DataProvider 包装到 ConfigurableFilterDataProvider 中,以便您可以传递您选择的过滤器对象。
您可以在此处找到完整示例:https://vaadin.com/docs/v14/flow/binding-data/tutorial-flow-data-provider/#filtering-based-on-another-component