Vaadin Grid - 特定的行总是在最上面

Vaadin Grid - specific rows always on top

我有两个 类,一个名为“文件夹”,第二个名为“项目”。我正在使用一个界面在一个 Vaadin 网格中一起显示文件夹和项目。我写了一个自定义比较器来正确排序文件夹和项目(文件夹在上面)。但问题是用户能够更改排序顺序,然后文件夹在底部。 我的问题是如何让文件夹始终在最前面?是否可以检测比较器中选择的顺序?

grid.addColumn(e -> e.getName())
        .setHeader("Name")
        .setSortable(true)
        .setComparator((item1, item2) -> {
            if (item1 instanceof Folder && item2 instanceof Item) {
                return -1;
            } else if (item1 instanceof Item && item2 instanceof Folder) {
                return 1;
            } else {
                return item1.getName().compareTo(item2.getName());
            }
        })

您需要一个比较器,它总是首先根据类别(在您的情况下是文件夹还是项目)排序,然后根据实际列值排序以解决关系。为了使事情稍微复杂一些,无论排序顺序是升序还是降序,都使用相同的比较器。您需要通过使类别比较顺序补偿列的排序顺序来补偿这一点,以确保反向排序不会将文件夹放在最后。

我在下面为这个想法实现了一个简单的概念证明,但是您可能需要对这个概念进行一些调整,以防您可能在那里有空值,或者如果您需要支持同时对多个列进行排序.

@Route
public class View1 extends VerticalLayout {
    record Item(String category, String name) { }

    public View1() {
        Grid<Item> grid = new Grid<Item>();
        grid.addColumn(Item::category).setHeader("Category");
        grid.addColumn(Item::name).setHeader("Name").setSortable(true).setComparator((a, b) -> {
            int categoryOrder = a.category.compareTo(b.category);
            if (categoryOrder == 0) {
                return a.name.compareTo(b.name);
            }
            return grid.getSortOrder().get(0).getDirection() == SortDirection.ASCENDING ? categoryOrder
                    : -categoryOrder;
        });
        grid.setItems(new Item("a", "a"), new Item("a", "c"), new Item("a", "b"), new Item("b", "a"),
                new Item("b", "c"), new Item("b", "b"));

        add(grid);
    }
}