【问题标题】:javafx listview shows too many items [duplicate]javafx listview显示太多项目[重复]
【发布时间】:2014-12-16 00:28:29
【问题描述】:

我在 JavaFX 中有一个 ListView,当我删除一个项目时,会在 ListView 中显示更多项目,但不在列表中。

ObservableList 和 Extractor 的声明

Callback<ElectricDeviceType, Observable[]> deviceTypeExtractor = new Callback<ElectricDeviceType, Observable[]>() {
    @Override
    public Observable[] call(ElectricDeviceType t) {
        return new Observable[] { t.maxValue, t.name, t.getDevices() };
    }
};
ObservableList<ElectricDeviceType> deviceTypes = FXCollections
        .observableArrayList(deviceTypeExtractor);    

这里我将设备设置为 ListView

    public void setElectricDevices(ElectricDeviceType... list) {
    deviceTypes.addAll(list);
    deviceTypeList.setItems(deviceTypes);
    deviceTypeList
            .setCellFactory(new Callback<ListView<ElectricDeviceType>, javafx.scene.control.ListCell<ElectricDeviceType>>() {
                @Override
                public ListCell<ElectricDeviceType> call(
                        ListView<ElectricDeviceType> listView) {
                    return new ElectricDeviceTypeListViewCell(_this,
                            simulation);
                }
            });
}

类 ElectricDeviceTypeListViewCell

public class ElectricDeviceTypeListViewCell extends ListCell<ElectricDeviceType> {
private MainWindowController controller;
private Simulation simulation;

public ElectricDeviceTypeListViewCell(MainWindowController c, Simulation s) {
    controller = c;
    simulation = s;
}

@Override
public void updateItem(ElectricDeviceType t, boolean empty) {
    super.updateItem(t, empty);
    if (t != null) {
        ElectricDeviceTypeController data = new ElectricDeviceTypeController(controller, simulation);
        data.setInfo(t);
        setGraphic(data.getBox());
    }
}

}

当我从我的 observable 列表中删除一项时,我的 listview 显示 5 个项目而不是 2 个。但我的 observable 里面只有 2 个项目。如果我删除所有项目,那么我也会删除重复项。

Before delete

After delete

你能帮我解决这个问题吗?

【问题讨论】:

  • 您不知道单元机制是如何实现的(即使您知道,也不应该依赖于保持不变的实现)。无法保证列表视图会为您添加的新项目重用显示已删除项目的相同单元格。请尝试建议的解决方案。
  • 谢谢你,我试过了,它成功了:)

标签: listview javafx duplicates refresh


【解决方案1】:

我猜你应该更新你的 ElectricDeviceTypeListViewCell 以在更新空和 null 值时更改其单元格:

@Override
public void updateItem(ElectricDeviceType t, boolean empty) {
    super.updateItem(t, empty);
    if(empty || t == null) {
      setGraphic(null);
      setText(null);
    }
    else {
        ElectricDeviceTypeController data = new ElectricDeviceTypeController(controller, simulation);
        data.setInfo(t);
        setGraphic(data.getBox());
    }
}

【讨论】:

  • 这已经在 SO 上回答了好几次,(例如here)。
  • 谢谢!这就是解决方案
  • @James_D 你提交评论时我已经在打字了。 StackOverflow 多线程出错 ;-) 但你是对的,这可能会被标记为重复。
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2018-06-10
  • 1970-01-01
相关资源
最近更新 更多