2013-07-25 147 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