【问题标题】:How to create a bottom up listview in javafx?如何在 javafx 中创建自下而上的列表视图?
【发布时间】:2017-08-19 14:24:30
【问题描述】:

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

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

【问题讨论】:

  • 我猜你是在鼹鼠山上造山。 30 个updateItem 调用不应该很昂贵,除非您在updateItem 方法本身中做昂贵的事情。在这种情况下,缓存可能会有所帮助...
  • @fabian 这只是一个例子。在某些情况下,我在列表视图中有 +1000 个项目。

标签: java javafx


【解决方案1】:

updateItem 仅对可见单元格调用。列表中有多少项目并不重要。为此目的创建自下而上的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 调用初始化 ListView54 以进行列表修改。这不会改变最初有 20 个或 10000 个项目(我测试程序时显示大约 17 个单元格)。

【讨论】:

  • 你能帮我重新实现 listview 皮肤自下而上的行为吗?
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多