代码之家  ›  专栏  ›  技术社区  ›  Basil Bourque

在vaadin8中为网格刷新DataProvider中的项,并实现“getId”方法

  •  2
  • Basil Bourque  · 技术社区  · 6 年前

    这个 DataProvider::refreshItem 使用的方法 Grid

    • 依赖我的bean实现 equals hashCode
    • 实施 getId

    引用JavaDoc:

    void refreshItem(T item)

    刷新给定项。此方法应用于通知所有DataProviderListeners某个项已被更新或替换为新实例。

    要使其正常工作,该项必须实现 Object.equals(Object) Object.hashCode() getId(Object) 应实现以返回适当的标识符。

    上面的最后一条是棘手的部分。

    我的问题是: DataProvider::getId ?

    DataProvider 我看到过这样的结果:数据提供者由其他调用返回,或者由内部生成,而不是子类化。如果正常的路线 数据提供者 在编写自己的实现时不涉及子类化,那么如何重写呢 获取ID 提供一个实现?

    2 回复  |  直到 4 年前
        1
  •  2
  •   Leif Åstrand    6 年前

    如果愿意,您仍然可以创建自己的数据提供程序子类,即使大多数示例使用更方便的工厂方法。延伸自 AbstractBackEndDataProvider ListDataProvider 通常是最好的起点。

    CallbackDataProvider 它将两个常规回调作为前两个参数,然后是第三个回调,该回调接收一个项并应返回一个可以用作该项标识符的对象。

    直接或间接覆盖 getId 被视为一个相对很少使用的功能,所以我们选择了不污染顶层 DataProvider 与工厂方法的接口。

        2
  •  0
  •   Vikrant Thakur    6 年前
    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 .