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);
}
}
我有两个 类,一个名为“文件夹”,第二个名为“项目”。我正在使用一个界面在一个 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);
}
}