Vaadin 网格和最初排序的数据

Vaadin Grid and initially sorted data

我有一个带有索引容器的网格组件,其中数据最初分为两列(数据来自 Elasticsearch)。我如何告诉 Grid 了解此排序,然后在加载 Grid 时在列标题中显示正确的排序图标?

编辑 #1 我试图重新定义网格 public List<SortOrder> getSortOrder() 方法以 return 正确排序数据,但它不起作用 ...

您没有显示太多代码,所以我必须假设您正在使用默认的索引容器,然后添加像 grid.addColumn("c1", String.class); 这样的列。如果这是真的,那么您似乎无法提供自己的容器实现,因为 vaadin 在提供不同的容器和添加列时会抛出异常(还没来得及弄清楚原因):

protected void addColumnProperty(Object propertyId, Class<?> type, Object defaultValue) throws IllegalStateException {
    if(!this.defaultContainer) {
        throw new IllegalStateException("Container for this Grid is not a default container from Grid() constructor");

在这种情况下,您或许可以创建自己的 Grid 实现来绕过该问题,或者您可以像下面的示例一样使用 bean 项容器,在其中覆盖 doSort 方法而不执行任何操作:

BeanItemContainer<MyBean> dataSource = new BeanItemContainer<MyBean>(MyBean.class) {
    @Override
    protected void doSort() {
        // nop, data is already sorted
    }
};
Grid grid = new Grid(dataSource);

然后只需在网格上调用setSortOrder方法即可。

import com.vaadin.data.sort.Sort;
import com.vaadin.shared.data.sort.SortDirection;
...
grid.setSortOrder(Sort.by("c3", SortDirection.ASCENDING).then("c2", SortDirection.DESCENDING).build());

这导致 c3 列首先升序排列,然后 c2 降序排列(查看排序图标附近的数字):

请注意,headers 列仍然可以点击,因此排序图标会发生变化,事件也会被触发,但不会发生任何事情,因为 doSort 已被覆盖。您可能需要对此做出反应,以便您可以添加一个 sortListener 并请求一批新数据,根据用户选择排序:

grid.addSortListener(new SortEvent.SortListener() {
    @Override
    public void sort(SortEvent sortEvent) {
        // request data sorted according to the user selection
    }
});