ListView设置虚拟行高

标签 listview javafx

一个小的图形问题,但我有一个 ListView 设置为显示自定义对象,其设置高度高于默认值。我尝试使用 setFixedCellSize(),它在大多数情况下都能完美运行,但在一种情况下,某些单元格的单元格高度可能会根据用户交互而增大和缩小。

class Example extends Label {
    private boolean change = true;
    public Example(String text) {
        super(text);
        setMinHeight(150);
        setPrefHeight(150);
        setMaxHeight(150);
        Hyperlink link = new Hyperlink("Change");
        setGraphic(link);
        link.setOnAction(ae -> {
            change = !change;
            if(change) {
                setMinHeight(80);
                setPrefHeight(80);
                setMaxHeight(80);
            } else {
                setMinHeight(180);
                setPrefHeight(180);
                setMaxHeight(180);
            }
        });
    }
}

ListView<Node> list = new ListView<>();
list.setFixedCellSize(150);
list.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
list.getItems().addAll(new Example("Hello world"), new Example("12345"));

在我上面的示例中,单击超链接时标签会更改高度。添加 setFixedCellSize() 后,它不再执行此操作。是否有另一种方法可以实现更改虚拟行的相同效果但允许自定义节点更改高度?

最佳答案

您可以设置一个自定义单元格工厂,它根据单元格的状态设置您想要的高度(我假设“虚拟单元格”是指空单元格):

ListView<String> lv = new ListView<>();
lv.setCellFactory(lst ->
        new ListCell<String>() {
            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setPrefHeight(45.0);
                    setText(null);
                } else {
                    setPrefHeight(Region.USE_COMPUTED_SIZE);
                    setText(item);
                }
            }
        });
lv.getItems().addAll("Hello", "World");

这将导致非空单元格具有其首选大小(根据内容,在本例中它只是字符串),而空单元格将具有其首选大小 45。

Illustration

关于ListView设置虚拟行高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46249112/

相关文章:

java - XML 节点列表作为 JavaFX 可观察列表?

Android Recyclerview vs ListView with Viewholder

android - 顶部和底部的 TextViews,剩余空间填充 ListView

Android 自定义数组适配器 getView 未被调用

android - Json 数组未在 ListView 中正确显示

java - 当尝试运行 Javafx 应用程序时,它会打开一个空框

java - Android:在ListView中显示特殊字符

java - 如何制作非相对JavaFx 'Media'

java - 为什么即使在 loadContent(...) 之后 Document 还是 null? -(Web View JavaFx)

java - 以编程方式设置 Controller 时为 "No Controller specified for top level element"