如何在javafx中创建自底向上的listview?

如何在javafx中创建自底向上的listview?,java,javafx,Java,Javafx,一些用例,如必须添加到列表顶部的消息列表,需要具有反向列表视图。因为: 我们有一个包含20项的列表视图。使用listItems.addAll0在列表顶部添加10项时,为newItems;javafx调用updateItem 30次,因为20个旧项索引已更改。如果列表项有一个巨大的ui,这可能需要更多的cpu使用。仅对可见单元格调用updateItem。列表中有多少项并不重要。为此目的创建一个自底向上的ListView应该没有什么真正的好处,因为它可能需要您重新实现ListView皮肤 您可以使用

一些用例,如必须添加到列表顶部的消息列表,需要具有反向列表视图。因为:

我们有一个包含20项的列表视图。使用listItems.addAll0在列表顶部添加10项时,为newItems;javafx调用updateItem 30次,因为20个旧项索引已更改。如果列表项有一个巨大的ui,这可能需要更多的cpu使用。

仅对可见单元格调用updateItem。列表中有多少项并不重要。为此目的创建一个自底向上的ListView应该没有什么真正的好处,因为它可能需要您重新实现ListView皮肤

您可以使用以下代码对此进行检查:

int counter = 0;

@Override
public void start(Stage primaryStage) {
    ListView<Integer> listview = new ListView<>();
    listview.setCellFactory(lv -> new ListCell<Integer>() {

        @Override
        protected void updateItem(Integer item, boolean empty) {
            super.updateItem(item, empty);
            System.out.println("called "+ ++counter);
            setText(item == null ? "" : item.toString());
        }

    });
    listview.getItems().addAll(IntStream.range(0, 10000).boxed().collect(Collectors.toList()));
    VBox.setVgrow(listview, Priority.ALWAYS);

    VBox root = new VBox();
    Button button = new Button("add");
    button.setOnAction(evt -> {
        System.out.println("-------------------------------------------------");
        listview.getItems().addAll(0, IntStream.range(listview.getItems().size(), listview.getItems().size()+20).boxed().collect(Collectors.toList()));
    });
    root.getChildren().addAll(listview, button);

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}

对我来说,40个updateItem调用初始化ListView,54个调用修改列表。这不会改变最初是有20个还是10000个项目,当我测试程序时,会显示大约17个单元格。

我猜你是小题大做。30个updateItem调用不应该很昂贵,除非你在updateItem方法本身中做了昂贵的事情。不过,在这种情况下,缓存可能会有所帮助…@fabian,这只是一个例子。在某些情况下,我在listview中有+1000个项目。你能帮我重新实现listview皮肤自底向上的行为吗?