可观察列表更改后,JavaFX 8 列表视图仍显示旧列表的一部分

After observable list change, JavaFX8 listview still shows portion of old list

  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);
        }
    });

如何让我的列表视图在切换内容之前自行清空?

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

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,解决了问题。显然我需要多研究一下细胞工厂...

if (item != null) {
    setText(item.getTicket());
} else {
    setText(null);
}

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