【问题标题】:How to order Grid having selected rows always as first / top rows of Grid?如何订购具有选定行的网格始终作为网格的第一行/顶行?
【发布时间】:2018-05-05 22:12:26
【问题描述】:

我想在 Vaadin Grid 组件上将所选行(在多选模式下)设置为第一个显示的行,即按所选行排序。

有人知道这是否可能吗?

【问题讨论】:

    标签: java sorting grid vaadin comparator


    【解决方案1】:

    这是可能的。我在这里提出一种解决方案,它有四个需要注意的点。不过可能有更优雅的解决方案。

    1. 需要一个可以检查项目选择状态的比较器
    2. 比较器需要考虑排序顺序
    3. 排序是基于列的
    4. 无论如何都需要使用默认的排序方法/比较器对未选定的行进行排序,并且可能还需要在其他选定行中对选定的行进行排序。

    第 1 点和第 2 点通过创建同时实现 SortEvent.SortListenerComparator 得到满足

    @RequiredArgsConstructor
    // above is a lombok annotation to generate constructor
    // SelectedFirstComparator(grid, defaultComparator);
    public class SelectedFirstComparator<T>
            implements SerializableComparator<T>, SortListener<GridSortOrder<T>> {
        private final Grid<T> grid; // used to dig selected rows
        // defaultComparator is used when selection status is not taken 
        // account to handle rest of sorting, related to point 4   
        private final SerializableComparator<T> defaultComparator; 
        // sortOrder is used to inverse the sorting order between
        // selected & not selected items
        // if not used selected items will change between first & last rows 
        // and we need them always first 
        private int sortOrder = 1; 
        @Override
        public int compare(T o1, T o2) {
            boolean o1Selected = grid.getSelectedItems().contains(o1);
            boolean o2Selected = grid.getSelectedItems().contains(o2);
            // if one is selected and one is not the selected one "wins"
            if(o1Selected && !o2Selected) return 1 * sortOrder;
            if(!o1Selected && o2Selected) return -1 * sortOrder;
            // if both are selected arrange amongst first rows
            // with default comparator
            // if both are not-selected arrange them to natural order
            // with default comparator
            return defaultComparator.compare(o1, o2);
        }
    
        // This method is listening the sort order change
        // and updating the sortOrder to keep selected rows as firts 
        @Override
        public void sort(SortEvent<GridSortOrder<T>> event) {
            switch(event.getSortOrder().get(0).getDirection()) {
            case ASCENDING:
                sortOrder = -1;
                break;
            case DESCENDING:
                sortOrder = 1;
                break;
            }
        }
    }
    

    第 3 点

    您需要添加SelectedFirstComparator 的实例作为每个可排序列的比较器,例如

    col1.setComparator(col1Comparator);
    col2.setComparator(col2Comparator);
    ...
    

    对于每个 colXcomparator,您需要在构造时提供相应的默认比较器来处理该列的默认排序。如果 col1 是 String 类型,它将类似于

    SelectedFirstComparator<GridEntity> col1Comparator = 
        new SelectedFirstComparator<GridEntity>( grid, (e11, e12) -> {
            return e11.getName().compareTo(e12.getName());
        }
    );
    

    第 4 点

    要让比较器监控排序顺序和sort() 方法更新sortOrder,您需要将所有比较器注册到网格为SortListener

    grid.addSortListener(col1Comparator);
    grid.addSortListener(col2Comparator);
    ...
    

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      相关资源
      最近更新 更多