ListView que usa una fábrica de celdas personalizada no se actualiza después de eliminar elementos

Resuelto Wermerb asked hace 9 años • 2 respuestas

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 ListViewcon 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, ListViewserá lo siguiente:

  • 123-abc
  • 123-cba

Sin embargo, si elimina una fila, por ejemplo: la primera fila (123-abc), se ListViewverá 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.

Wermerb avatar Feb 07 '15 23:02 Wermerb
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.

Zavael avatar Nov 06 '2016 22:11 Zavael