Короткий ответ - нет. Вы можете обновить исходный список на основе изменений, которые происходят в ObservableList, но не наоборот.
Причина в том, что ObservableList уведомляет наблюдателей об изменениях, произошедших в коллекции.
Вы можете обновить список источников следующим образом:
Обновлено
В приведенном ниже примере есть 3 различных способа устранения неоднозначности лямбда, вам явно следует использовать только один.
public class SomeController {
public class SomeObject {}
private List<SomeObject> sourceList;
@FXML
private ListView<SomeObject> aView;
public void init(){
aView.getItems().addAll(sourceList);
// You can use method (which is strictly typed)
aView.getItems().addListener(this::updateSource);
// You can specify the type of the arguments
aView.getItems().addListener((Change<? extends SomeObject> changes)->{
ObservableList<? extends SomeObject> lst = changes.getList();
sourceList.clear();
sourceList.addAll(lst);
});
// You can specify the type of the functional interface
aView.getItems().addListener((ListChangeListener<SomeObject>) changes->{
ObservableList<? extends SomeObject> lst = changes.getList();
sourceList.clear();
sourceList.addAll(lst);
});
}
private void updateSource(Change<? extends SomeObject> chg) {
ObservableList<? extends SomeObject> data = chg.getList();
sourceList.clear();
sourceList.addAll(data);
}
}
Вместо этого у связанного списка нет эквивалентного метода для уведомления наблюдателей о его изменениях.
Метод полиморфизма делает синтаксис lambda неудобным, поскольку вы можете иметь (как в этом случае) одно и то же имя метода с разными сигнатурами методов, поэтому вы должны сообщить компилятору, какой из них вы используете (либо сделав параметры однозначными) или буквально указав функциональный интерфейс, который вы хотите передать как лямбда.
Например, в addListener of Observable обычно есть специальный слушатель для конкретного изменения этого подкласса и InvalidationListener для всех, поэтому вы должны сообщить компилятору, какой из 2 вы выбираете.