ListView CellFactory-如何正确删除单元格?

ListView CellFactory-如何正确删除单元格?,listview,javafx,listviewitem,Listview,Javafx,Listviewitem,我有一个列表视图,我正在为它添加一个上下文菜单。我有上下文菜单正在查找,但还有另一个问题 MysetCellFactorycode,用于设置上下文菜单: lvAppetites.setCellFactory(lv -> { ListCell<Appetite> cell = new ListCell<>(); ContextMenu contextMenu = new ContextMenu(); MenuItem editAppetite

我有一个
列表视图
,我正在为它添加一个
上下文菜单
。我有
上下文菜单
正在查找,但还有另一个问题

My
setCellFactory
code,用于设置上下文菜单:

lvAppetites.setCellFactory(lv -> {
    ListCell<Appetite> cell = new ListCell<>();
    ContextMenu contextMenu = new ContextMenu();

    MenuItem editAppetiteMenu = new MenuItem();

    editAppetiteMenu.textProperty().bind(Bindings.format("Edit ..."));
    editAppetiteMenu.setOnAction(event -> {
        // Code to load the editor window
        editAppetite(cell.getItem());
    });
    contextMenu.getItems().add(editAppetiteMenu);

    MenuItem deleteAppetiteMenu = new MenuItem();
    deleteAppetiteMenu.textProperty().bind(Bindings.format("Delete ..."));
    deleteAppetiteMenu.setOnAction(event -> {
        // Code to delete the appetite
    });
    contextMenu.getItems().add(deleteAppetiteMenu);

    contextMenu.getItems().add(new SeparatorMenuItem());

    MenuItem addAppetiteMenu = new MenuItem();
    addAppetiteMenu.textProperty().bind(Bindings.format("Add New ..."));
    addAppetiteMenu.setOnAction(event -> {
        // Code to delete the appetite
    });
    contextMenu.getItems().add(addAppetiteMenu);

    cell.textProperty().bind(cell.itemProperty().asString());

    // If nothing selected, remove the context menu
    cell.emptyProperty().addListener((obs, wasEmpty, isNowEmpty) -> {
        if (isNowEmpty) {
            cell.setContextMenu(null);
        } else {
            cell.setContextMenu(contextMenu);
        }
    });
    return cell;
});
lvAppetites.setCellFactory(lv->{
ListCell,我非常确信,
ListView
仍在显示已删除单元格的图形。我知道如何通过覆盖
updateItem
方法在ListView中处理该问题,但如何从
setCellFactory
方法中处理该问题

这是可能的还是我需要重构我的整个
列表视图


一如既往地感谢您的帮助!

问题源于线路

cell.textProperty().bind(cell.itemProperty().asString());
当单元格为空时,项将为null,因此绑定将(我相信)计算为字符串
“null”

尝试测试单元格是否为空或项是否为空的内容,例如

cell.textProperty().bind(Bindings
    .when(cell.emptyProperty())
    .then("")
    .otherwise(cell.itemProperty().asString()));
或者(感谢@fabian改进了这个版本)


为什么不在
updateItem
代码中处理支持列表单元格的项目的更新(包括项目删除,因为它们也注册为更新),而不是尝试在单元格工厂中内联进行更新?覆盖
updateItem
并处理任何逻辑都将是“标准”的实现这一点的方法,而不是通过绑定和侦听器。谢谢你,@James_D,一如既往。我以前从未见过
时的
/
范式。
cell.textProperty().bind(Bindings.createStringBinding(
    () -> Objects.toString(cell.getItem(), ""),
    cell.itemProperty()));