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
}
});
我有一个带有索引容器的网格组件,其中数据最初分为两列(数据来自 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
}
});