ListView не обновляется при обновлении атрибутов элементов наблюдаемого списка (JavaFX) ⇐ JAVA
-
Anonymous
ListView не обновляется при обновлении атрибутов элементов наблюдаемого списка (JavaFX)
Предположим, у меня есть наблюдаемый список с типом класса Food. Класс имеет 3 атрибута: строку с именем name, свойство объекта типа LocalDateTime с именем (дата истечения срока действия) и логическое свойство с именем (выбрано).
Предположим, у меня есть 3 элемента в списке и графический макет для заполнения ListView. Макет представляет собой квадрат с двумя метками для отображения названия и срока годности. и когда я нажимаю на элемент (выбираю элемент), макет становится синим, например, в соответствии с логическим свойством.
Проблема, с которой я столкнулся, заключается в том, что выбор работает правильно (правильно обновляется представление списка), но при изменении даты ListView не обновляет ячейку, хотя я попробовал экстрактор. Я даже добавил прослушиватель, чтобы проверить, фиксирует ли он изменение, и он это делает, но ListView по-прежнему не обновляет ячейку. ListView корректно обновляется при использовании метода set наблюдаемого списка, заменяя тот же элемент только для запуска ListView. Обновление ListView также работает, но я не хочу обновлять весь список, а только обновленный элемент.
Можете ли вы объяснить мне, почему это происходит и как это исправить?
Я попробовал экстрактор, я даже добавил прослушиватель, чтобы проверить, фиксирует ли он изменение, и он это делает, но ListView по-прежнему не обновляет ячейку.
Пример кода: класс =>
публичный класс Еда { частная строка food_name; частный BooleanProperty is_selected; частный ObjectProperty expiration_date; public Food (String food_name, логическое значение is_selected, LocalDateTime expiration_date) { this.food_name = food_name; this.is_selected = новый SimpleBooleanProperty(is_selected); this.expiration_date =new SimpleObjectProperty(expiration_date); } //...геттеры и сеттеры
пример:
public void example(){ ObservableList food= FXCollections.observableArrayList(); food.add(new Food("рыба",true, LocalDateTime.now())); food.add(new Food("milk",false,LocalDateTime.now().minusDays(1))); ListView foodListView=новый ListView(); foodListView.setItems(еда); foodListView.setCellFactory(foodListView1 -> { вернуть новую food_cell(); }); } Проблема: когда я меняю выбранное свойство, ListView обновляется, а графический макет меняет цвет, но когда я меняю свойство даты, это изменение не отражается на макете (ListView не обновляет элемент).
Предположим, у меня есть наблюдаемый список с типом класса Food. Класс имеет 3 атрибута: строку с именем name, свойство объекта типа LocalDateTime с именем (дата истечения срока действия) и логическое свойство с именем (выбрано).
Предположим, у меня есть 3 элемента в списке и графический макет для заполнения ListView. Макет представляет собой квадрат с двумя метками для отображения названия и срока годности. и когда я нажимаю на элемент (выбираю элемент), макет становится синим, например, в соответствии с логическим свойством.
Проблема, с которой я столкнулся, заключается в том, что выбор работает правильно (правильно обновляется представление списка), но при изменении даты ListView не обновляет ячейку, хотя я попробовал экстрактор. Я даже добавил прослушиватель, чтобы проверить, фиксирует ли он изменение, и он это делает, но ListView по-прежнему не обновляет ячейку. ListView корректно обновляется при использовании метода set наблюдаемого списка, заменяя тот же элемент только для запуска ListView. Обновление ListView также работает, но я не хочу обновлять весь список, а только обновленный элемент.
Можете ли вы объяснить мне, почему это происходит и как это исправить?
Я попробовал экстрактор, я даже добавил прослушиватель, чтобы проверить, фиксирует ли он изменение, и он это делает, но ListView по-прежнему не обновляет ячейку.
Пример кода: класс =>
публичный класс Еда { частная строка food_name; частный BooleanProperty is_selected; частный ObjectProperty expiration_date; public Food (String food_name, логическое значение is_selected, LocalDateTime expiration_date) { this.food_name = food_name; this.is_selected = новый SimpleBooleanProperty(is_selected); this.expiration_date =new SimpleObjectProperty(expiration_date); } //...геттеры и сеттеры
пример:
public void example(){ ObservableList food= FXCollections.observableArrayList(); food.add(new Food("рыба",true, LocalDateTime.now())); food.add(new Food("milk",false,LocalDateTime.now().minusDays(1))); ListView foodListView=новый ListView(); foodListView.setItems(еда); foodListView.setCellFactory(foodListView1 -> { вернуть новую food_cell(); }); } Проблема: когда я меняю выбранное свойство, ListView обновляется, а графический макет меняет цвет, но когда я меняю свойство даты, это изменение не отражается на макете (ListView не обновляет элемент).
Мобильная версия