observablearraylist llenar listas lista item fxcollections listview javafx listviewitem

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