Vaadin Grid和最初排序的数据

时间:2016-02-26 19:42:08

标签: vaadin vaadin7

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

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

1 个答案:

答案 0 :(得分:1)

您没有显示太多代码,因此我必须假设您使用默认的Indexed容器,然后添加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降序(请参阅排序图标附近的数字):

sorting sample

请注意,列标题仍然是可点击的,因此排序图标将会更改并触发事件,但由于doSort被覆盖,所以不会发生任何事情。您可能需要对此作出反应,以便您可以添加sortListener并请求新的数据批量,并根据用户选择进行排序:

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