2013-07-25 148 views
0

我无法更新我的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

我找到了解决方法。这不是真的美丽,但它的工作。我还是会挖一个更好的方式来做到这一点...

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类变化不大以便您有一个返回StringProperty而不是字符串的getHeadline()方法。

然后,让自己实现CellFactory,并结合textProperty由getHeadline()方法给出的StringProperty:当您更改底层列表中的相应单元格更新

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

现在

+0

感谢您的解决方法,但我希望有一个更好的方法来做到这一点。我会等几天才会接受你的回答。此外,我编辑我的帖子更轻松地更新特定项目的方式。 – Timo

+0

找到了更好的方法,更新我的帖子。 – Marc

+0

顺便说一句,如果你只选择一个项目,那么你更新列表的方式更有效率......如果你有一个大的列表,并且如果你选择了大量的项目,listView.getItems()。remove(selectedList )'会比删除和重新添加列表花费更多时间,因为它必须获取列表中的所有事件。我最近陷入了这个坑......我希望现在一切正常。 – Marc