Vaadin 8 Grid多过滤失效:设置双条件过滤后无数据显示
问题分析与解决方案
你这段代码的核心问题在于Predicate是不可变对象:调用and()方法并不会修改原来的filter实例,而是返回一个全新的、组合了两个条件的Predicate。但你现在的写法里,只是调用了and()却没有把返回的新对象赋值给filter变量,最终传给dataProvider.setFilter()的还是那个一开始就返回false的原始Predicate——这就导致所有数据都被过滤掉了,Grid自然显示为空。
修正方案一:正确赋值组合后的Predicate
把每次and()返回的新Predicate重新赋值给filter,确保最终使用的是组合了所有条件的过滤规则:
ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) grid.getDataProvider(); // 先初始化第一个条件 SerializablePredicate<Person> filter = Person -> Person.getAge() == 30; // 组合第二个条件,必须把返回值赋值回去 filter = filter.and(Person -> Person.getName().equalsIgnoreCase("bernd")); dataProvider.setFilter(filter);
修正方案二:更简洁的链式写法
如果不需要后续动态添加条件,可以直接把两个条件用&&组合,一步到位:
ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) grid.getDataProvider(); dataProvider.setFilter(Person -> Person.getAge() == 30 && Person.getName().equalsIgnoreCase("bernd"));
补充:动态添加多个条件的注意点
如果之后需要动态追加更多过滤规则,记住每次调用and()/or()后都要更新filter变量的引用:
SerializablePredicate<Person> filter = Person -> Person.getAge() == 30; // 添加姓名过滤条件 filter = filter.and(Person -> Person.getName().equalsIgnoreCase("bernd")); // 再追加城市过滤条件 filter = filter.and(Person -> Person.getCity().equals("Hamburg")); dataProvider.setFilter(filter);
内容的提问来源于stack exchange,提问作者FarFarAway
相关产品推荐
相关产品推荐

