Похоже, что ваши элементы списка - это больше, чем просто строки, и поэтому ваша модель должна быть более специализированным классом.В зависимости от того, насколько это сложно, вы можете даже захотеть использовать TableView
, но сейчас давайте предположим, что у вас есть только имя и изображение и вы хотите использовать ListView
.
Сначала вам нужен класс, описывающий элементы в списке - предположительно, они являются «продуктами» (так как это список покупок) и имеют описание и изображение:
class Product {
final StringProperty description = new SimpleStringProperty(this, "description");
final StringProperty image = new SimpleStringProperty(this, "image");
// add getters, property-getters and setters...
}
Далее, определите свой класс Cell
как расширение ListCell<Product>
- это будет означать, что свойство item
будет иметь тип Product
, как и тип аргумента item
для метода updateItem
.
Теперь, когда элемент обновляется / изменяется, вы можете изменить как описание, так и изображение:
@Override
protected void updateItem(Product item, boolean empty) {
super.updateItem(item, empty);
setText(null);
setGraphic(null);
if (item != null && !empty) {
description.setText(item.getDescription());
imageView.setImage(...);
setGraphic(hBox);
}
}
При добавлении элемента создайте новый экземпляр Product
с соответствующим описанием и изображением и добавьте его всписок.Обратите внимание, что нет необходимости вызывать setCellFactory
каждый раз при добавлении элемента - он должен вызываться один раз во время инициализации (гипотетически могут быть причины изменить фабрику ячеек после того, как она была установлена, но это не является обычной практикой ине нужен в вашем случае).
Примечание: загрузка изображений может быть медленной (в зависимости от размера изображения), поэтому вы можете кэшировать или предварительно загружать фактические Image
объекты.Вы также можете использовать один и тот же объект Image
в нескольких экземплярах ImageView
, поэтому, если несколько продуктов используют одно и то же изображение, это также может быть полезным.