更新列表 - 模型更改时查看

时间:2013-07-25 14:44:00

标签: listview javafx-2

我无法更新javafx.scene.control.ListView<Todo>控件。 如您所见,listview显示标题属性。 当我更改待办事项的标题时,列表视图仍会显示旧值。

public class Todo {

private StringProperty  headline    = new SimpleStringProperty();

private StringProperty  description = new SimpleStringProperty();

public Todo(String aHeadline) {
    this.setHeadline(aHeadline);
}

public Todo(String aHeadline, String aDescription) {
    this(aHeadline);
    this.description.set(aDescription);

}

public String getDescription() {
    return this.description.get();
}

public StringProperty descriptionProperty() {
    return this.description;
}

public void setDescription(String aDescription) {
    this.description.set(aDescription);
}

public String getHeadline() {
    return this.headline.get();
}

public void setHeadline(String aHeadline) {
    this.headline.set(aHeadline);
}

public static ObservableList<Todo> getMockups() {
    try {
        return FXCollections.observableArrayList(TodoXmlParser.getTodosFromXml(Paths.get("/Todos.xml")));
    } catch (JDOMException | IOException e) {
        e.printStackTrace();
    }
    return null;

}

@Override
public String toString() {
    return this.headline.get();
}

}

 this.listView = new ListView<>();
 this.listView.setItems(Todo.getMockups());
 this.listView.getSelectionModel().getSelectedItem().setHeadline("new");

我错过了像listview.refresh(), or update()这样的方法 那么这样做的正确方法是什么?

编辑:我找到了一种方法,但我很高兴,如果有人能够解释“官方”的做法。

    void updateListView(Todo todo) {
    int index = this.listView.getItems().indexOf(todo);
    this.listView.getItems().remove(todo);
    this.listView.getItems().add(index, todo);
}

1 个答案:

答案 0 :(得分:1)

我找到了解决方法。它并不是真的美丽,但它确实起作用。我还在挖掘一个更好的方法......

    int index = listView.getSelectionModel().getSelectedIndex();
    System.out.println(listView.getItems());

    ObservableList<Todo> olist = listView.getItems();
    olist.get(index).setHeadline("new");
    listView.setItems(null);
    listView.setItems(olist);

OR

    listView.getSelectionModel().getSelectedItem().setHeadline("new 2");
    ObservableList<Todo> olist = listView.getItems();
    listView.setItems(null);
    listView.setItems(olist);

这是“更好”的方式

在您的Todo类中进行一些更改,以便您使用getHeadline()方法返回StringProperty而不是字符串。

然后,创建自己的CellFactory实现并将getHeadline()方法给出的StringProperty绑定到textProperty:

    listView.setCellFactory(new Callback<ListView<Todo>, ListCell<Todo>>() {
        public ListCell<Todo> call(ListView<Todo> param) {
            final ListCell<Todo> cell = new ListCell<Todo>() {
                @Override
                public void updateItem(Todo item, boolean empty) {
                    super.updateItem(item, empty);
                    if (item != null) {
                        textProperty().bind(item.getHeadline());
                    }
                }
            };
            return cell;
        }
    });

现在,当你对基础列表进行更改时,相应的单元格会更新