我有一个带有索引容器的网格组件,其中数据最初分为两列(数据来自Elasticsearch)。如何告诉Grid了解此排序,然后在加载Grid时在列标题中显示正确的排序图标?
编辑#1
我试图重新定义Grids public List<SortOrder> getSortOrder()
方法以返回正确的排序数据,但它不起作用......
答案 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降序(请参阅排序图标附近的数字):
请注意,列标题仍然是可点击的,因此排序图标将会更改并触发事件,但由于doSort
被覆盖,所以不会发生任何事情。您可能需要对此作出反应,以便您可以添加sortListener并请求新的数据批量,并根据用户选择进行排序:
grid.addSortListener(new SortEvent.SortListener() {
@Override
public void sort(SortEvent sortEvent) {
// request data sorted according to the user selection
}
});