listas - llenar listview javafx
ListView CellFactory-¿Cómo eliminar celdas correctamente? (1)
Tengo un ListView
que estoy trabajando para agregar un ContextMenu
. Tengo el ContextMenu
funciona pero tengo otro problema.
Mi código setCellFactory
, utilizado para configurar los menús de contexto:
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;
});
My ListView
se puede buscar a través de un TextField
con un oyente; el oyente filtra los elementos en el ListView
medida que el usuario escribe.
El problema ahora es que a medida que se filtra la lista, las celdas vacías ahora muestran null
.
Después de leer otra pregunta , estoy bastante seguro de que ListView
aún muestra un gráfico para las celdas eliminadas. Sé cómo manejar eso dentro de ListView anulando el método updateItem
, pero ¿cómo manejaría esto desde mi método setCellFactory
?
¿Es eso posible o tendré que refactorizar mi ListView
completo?
¡Gracias, como siempre, por toda tu ayuda!
El problema surge de la línea
cell.textProperty().bind(cell.itemProperty().asString());
Cuando la celda está vacía, el elemento será nulo, por lo que el enlace (creo) evaluará la cadena como "null"
.
Intente algo que pruebe que la celda está vacía o el elemento es nulo, por ejemplo
cell.textProperty().bind(Bindings
.when(cell.emptyProperty())
.then("")
.otherwise(cell.itemProperty().asString()));
o (gracias a @fabian para refinar esta versión)
cell.textProperty().bind(Bindings.createStringBinding(
() -> Objects.toString(cell.getItem(), ""),
cell.itemProperty()));