Я использую ListView в своем проекте и хотел добавить контекстное меню для каждого элемента списка, чтобы каждый из них можно было удалить по отдельности. При использовании следующего кода это работает нормально:
postList.setCellFactory(lv -> {
ListCell<Result> cell = new ListCell<>();
ContextMenu contextMenu = new ContextMenu();
StringBinding stringBinding = new StringBinding() {
{
super.bind(cell.itemProperty().asString());
}
@Override
protected String computeValue() {
if (cell.itemProperty().getValue() == null) {
return "";
}
return cell.itemProperty().getValue().getTitle();
}
};
cell.textProperty().bind(stringBinding);
MenuItem deleteItem = new MenuItem();
deleteItem.textProperty().bind(Bindings.format("Delete item"));
deleteItem.setOnAction(event -> postList.getItems().remove(cell.getItem()));
contextMenu.getItems().addAll(openPermalink, openSubreddit, openURL, deleteItem);
cell.emptyProperty().addListener((obs, wasEmpty, isNowEmpty) -> {
if (isNowEmpty) {
cell.setContextMenu(null);
} else {
cell.setContextMenu(contextMenu);
}
});
return cell;
});
Однако после очистки списка записей - хотя элементы, по-видимому, удаляются, - когда добавляется другой, все удаленные элементы появляются снова, а добавляемый элемент не отображается.
Любые предметы, что может быть причиной этого? Это происходит только тогда, когда я устанавливаю фабрику ячеек, в противном случае все в порядке.
Я записал небольшой GIF, чтобы лучше объяснить проблему:
Спасибо!
Редактировать: Похоже, что проблема в основном связана с этим сегментом
StringBinding stringBinding = new StringBinding() {
{
super.bind(cell.itemProperty().asString());
}
@Override
protected String computeValue() {
if (cell.itemProperty().getValue() == null) {
return "";
}
return cell.itemProperty().getValue().getTitle();
}
};
Похоже, что, несмотря на то, что предметы есть, они имеют пустой заголовок дисплея