在可观察列表更改后,JavaFX8 listview仍显示旧列表的一部分

时间:2016-10-25 03:22:34

标签: java listview javafx-8 refresh

  1. 我使用列表(a)加载列表视图。
  2. 为了响应切换更改,我将列表视图内容切换到另一个列表(b)。 如果列表(a)比列表(b)长,则多余的项目仍然显示在列表视图中,即使它不再可选。
  3. 例如,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);
            }
        });
    

    如何在切换内容之前让我的listview自动消隐?

2 个答案:

答案 0 :(得分: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,解决了这个问题。显然我需要更多地研究细胞工厂......

答案 1 :(得分:1)

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

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