2013-07-25 3 views
0

Я не могу обновить свой контроль javafx.scene.control.ListView<Todo>. Как вы видите, listview отображает свойство заголовка. Когда я изменяю заголовок todo, в представлении списка все еще отображается старое значение.Update List-View при изменении модели

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

ИЛИ

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

Вот «лучше» способ

сделать небольшие изменения в вашем классе Todo так что у вас есть метод getHeadline(), который возвращает строку StringProperty вместо строки.

Затем сделать свой собственный реализацию CellFactory и связываются с TextProperty в StringProperty данное методом getHeadline():

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

Смежные вопросы