【问题标题】:After observable list change, JavaFX8 listview still shows portion of old list在 observablelist 更改后,JavaFX 8 listview 仍然显示旧列表的一部分
【发布时间】:2017-03-06 23:08:12
【问题描述】:
  1. 我加载了一个带有列表 (a) 的列表视图。
  2. 为了响应切换更改,我将列表视图内容切换到另一个列表 (b)。 如果列表 (a) 比列表 (b) 长,则超出的项目仍会显示在列表视图中,即使不再可选择。

例如,buyList = {'100532','100533'} 和 saleList = {'100000'}。如果我从选择 radioBuy 开始,列表将显示“100532”和“100533”。将切换开关从 radioBuy 切换到 radioSale 将导致列表显示“100000”和“100533”。 “100533”不可选择,但仍可见。

已显示可观察列表本身具有正确的大小并包含正确的项目。只是ListView显示显示了一些旧数据。

我尝试过的事情:
1.ticketListView.getItems().clear(),然后在列表切换前重建一个新列表。
2.使用ticketListView.getItems().removeAll(0, ticketListView.getItems().size()) 3. 使用循环单独删除每个项目。 4. 结合以上所有使用ticketListView.refresh()

我的切换 ChangeListener:

    typeGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
    public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {
            if (typeGroup.getSelectedToggle().equals(radioBuy))
                ticketListView.setItems(buyList);
            if (typeGroup.getSelectedToggle().equals(radioTransfer))
                ticketListView.setItems(transList);
            if (typeGroup.getSelectedToggle().equals(radioSale))
                ticketListView.setItems(saleList);
        }
    });

如何让我的列表视图在切换内容之前使其空白?

【问题讨论】:

  • 您的列表视图是否有自定义单元工厂?如果是这样,请将其包含在问题中。
  • 没有自定义单元工厂。我只是修改了列表包含的对象的toString方法,所以列表可以认为是字符串列表。
  • 好的,所以我的第一个猜测是不正确的。我从未见过这种行为:预期的行为是简单地调用setItems(...) 就足以完全刷新列表视图。我建议您创建一个 minimal reproducible exampleedit 您的问题以包含它。
  • 我用最小的应用程序测试了您发布的确切代码,我可以包装它,使其编译和运行,并且它完全按预期工作(每次都正确清除列表)。所以你的代码中的其他地方导致了这个问题。

标签: java listview javafx-8 refresh


【解决方案1】:

很抱歉浪费了大家的时间。事实证明我确实在使用自定义单元工厂:

ticketListView.setCellFactory(new Callback<ListView<Header>,
                                          ListCell<Header>>() {
                                      public ListCell<Header> call(ListView<Header> headerListView) {
                                          return new ListCell<Header>() {
                                              @Override
                                              protected void updateItem(Header item, boolean empty) {
                                                  super.updateItem(item, empty);
                                                  if (item != null) {
                                                      setText(item.getTicket());
                                                  }
                                              }
                                          };
                                      }
                                  }
    );

删除此代码并按照我之前提到的方法覆盖 toString,解决了问题。显然我需要多研究一下细胞工厂……

【讨论】:

【解决方案2】:
if (item != null) {
    setText(item.getTicket());
} else {
    setText(null);
}

您应该添加此代码以清除空单元格。

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多