我无法更新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);
}
答案 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;
}
});
现在,当你对基础列表进行更改时,相应的单元格会更新