элемента ListView CellFactory-Как правильно удалить ячейки?



listview с картинками android (1)

У меня есть ListView которым я работаю, чтобы добавить ContextMenu . У меня есть рабочая находка ContextMenu но есть другая проблема.

Мой код setCellFactory , используемый для настройки контекстных меню:

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

Мой ListView доступен для поиска через TextField с прослушивателем; слушатель фильтрует элементы в ListView типу пользователя.

Проблема в том, что при фильтрации списка все пустые ячейки теперь отображают null .

Из чтения другого вопроса я уверен, что ListView по-прежнему отображает графику для удаленных ячеек. Я знаю, как обрабатывать это в ListView, переопределяя метод updateItem , но как я могу обработать это из моего метода setCellFactory ?

Возможно ли это, или мне нужно будет реорганизовать весь мой ListView ?

Спасибо, как всегда, за вашу помощь!


Проблема возникает из линии

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

Когда ячейка пуста, элемент будет пустым, поэтому привязка будет (я считаю) оценивать по строке "null" .

Попробуйте что-то, что проверяет, что ячейка пуста или элемент является нулевым, например

cell.textProperty().bind(Bindings
    .when(cell.emptyProperty())
    .then("")
    .otherwise(cell.itemProperty().asString()));

или (благодаря @fabian для уточнения этой версии)

cell.textProperty().bind(Bindings.createStringBinding(
    () -> Objects.toString(cell.getItem(), ""),
    cell.itemProperty()));




listviewitem