ListView que usa una fábrica de celdas personalizada no se actualiza después de eliminar elementos
Estoy aprendiendo JavaFX y quería crear una fábrica de células que funcione correctamente hasta que quiera eliminar una fila de mi ListView
:
plateList.setCellFactory(new Callback<ListView<Car>, ListCell<Car>>() {
@Override
public ListCell<Car> call(ListView<Car> param) {
ListCell<Car> cell = new ListCell<Car>() {
@Override
protected void updateItem(Car item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item.getPlate());
}
}
};
return cell;
}
});
Estoy completando el ListView
con algunos datos de muestra:
ObservableList<Car> sample = FXCollections.observableArrayList();
sample.add(new Car("123-abc", "opel", "corsa", 5.5));
sample.add(new Car("123-cba", "vw", "passat", 7.5));
plateList.setItems(sample);
Ahora veré lo que espero, ListView
será lo siguiente:
- 123-abc
- 123-cba
Sin embargo, si elimina una fila, por ejemplo: la primera fila (123-abc), se ListView
verá así:
- 123-cba
- 123-cba
Esta es la parte de eliminación:
@FXML
private void deleteBtnAction() {
plateList.getItems().remove(plateList.getSelectionModel().getSelectedItem());
ObservableList<Car> t = plateList.getItems();
plateList.setItems(t);
}
Si elimino la fábrica de células, el programa funciona según lo previsto. Cualquier ayuda es muy apreciada.
Aceptado
Según el documento Java del método Cell updateItem , existe un uso recomendado ligeramente diferente al aceptado:
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
setGraphic(null);
} else {
setText(item.toString());
}
}
La diferencia está en el uso del parámetro empty
. Pero la solución de @Adam también debería funcionar correctamente en los casos más importantes.