Grid
和其他窗口小部件使用的DataProvider::refreshItem
方法为窗口小部件提供了两种替代方法,以标识您要刷新的包含项中的哪些:
equals
和hashCode
实现,可靠地标识同一对象,而无需依赖可变成员字段(属性)。getId
引用JavaDoc:
void refreshItem(T item)
刷新给定的项目。应该使用此方法来通知所有DataProviderListener某项已被更新或被新实例替换。
为使此方法正常运行,该项目必须实现
Object.equals(Object)
和Object.hashCode()
才能将旧项目实例和新项目实例都视为相等,或者应实施getId(Object)
返回适当的标识符。
上面的最后一条是棘手的部分。
➥我的问题是:如何实施DataProvider::getId
?
每个DataProvider
的示例我都看到结果是DataProvider由其他调用返回,或者在内部生成,而不是子类化。如果到DataProvider
的常规路由在编写您自己的实现时不涉及子类化,那么一个人如何覆盖getId
来提供实现?
答案 0 :(得分:2)
即使您愿意,您仍然可以创建自己的数据提供程序子类,即使大多数示例使用更方便的工厂方法。从AbstractBackEndDataProvider
或ListDataProvider
扩展通常是最好的起点。
另一种选择是使用CallbackDataProvider
的三参数构造函数,该构造函数将两个常规回调作为前两个参数,然后将第三个回调接收一个项目,并应返回一个可用作对象的对象。该项目的标识符。
直接或间接覆盖getId
被视为一种相对很少使用的功能,因此对于这些情况,我们选择不使用工厂方法来污染顶级DataProvider
界面。
答案 1 :(得分:0)
public class EmployeeDataProvider extends AbstractBackEndDataProvider<Employee, String> {
private static final long serialVersionUID = 1L;
private final EmployeeService employeeService;
public EmployeeDataProvider(EmployeeService employeeService) {
// TODO Auto-generated constructor stub
this.employeeService = employeeService;
}
@Override
protected Stream<Employee> fetchFromBackEnd(Query<Employee, String> query) {
// TODO Auto-generated method stub
return employeeService.fetchEmployees(query.getFilter().orElse(null), query.getLimit(), query.getOffset(),
query.getSortOrders()).stream();
}
@Override
protected int sizeInBackEnd(Query<Employee, String> query) {
// TODO Auto-generated method stub
return employeeService.countEmployees(query.getFilter().orElse(null));
}
@Override
public Object getId(Employee item) {
// TODO Auto-generated method stub
return item.getId();
}
}
您可以找到有效的示例代码here。