Я загружаю данные JSON из Интернета, собирая данные об элементах, таких как имя, автор и URL-адрес изображения. Затем я хочу загрузить их один под другим, поэтому я помещаю их в список. Я добавляю их только один раз как пользовательский класс, который содержит только эти переменные.
У меня проблема с тем, что эти значения дублируются и не отображаются должным образом. Например, он загрузил бы первые 5 элементов (из 20) и повторил бы их для оставшихся 15. Я не понимаю, почему это происходит, также пробовал зацикливаться на массиве items listview и распечатывать их, и все они разные , также пытался выполнить для них refresh(), но, похоже, это вообще ничего не меняет.
Я добавляю код, который я использую для создания списка, и часть, которую я использую для его заполнения.
val lv = listview<Item>{
anchorpaneConstraints {
topAnchor = 0.0
bottomAnchor = 0.0
leftAnchor = 0.0
rightAnchor = 0.0
}
cellFormat {
graphic = cache {
form {
fieldset {
hbox {
spacing = 10.0
println(it.name)
println(it.author)
println(it.imgurl)
println(it.desc)
imageview {
image = Image(it.imgurl)
prefWidth(256.0)
prefHeight(256.0)
}
vbox {
field("Name") {
label(it.name)
}
field("Author") {
label(it.author)
}
field("Description") {
label {
text = it.desc
wrapWidth = 150
}
}
}
}
}
}
}
}
}
val tmpItems = items.clone() as ArrayList<JsonObject>()
val arr = ArrayList<Item>()
for (m in tmpItems) {
arr.add(
Item(
m["name"].toString(),
m["author"].toString(),
m["desc"].toString(),
m["imgUrl"].toString()
)
)
}
lv.items.addAll(arr)
Я ожидал, что на выходе будет 20 уникальных элементов, как в lv.items, но показанный результат — 5 уникальных элементов, повторяющихся в 20 строках.





При использовании cache вам необходимо указать уникальный идентификатор для каждого элемента, чтобы платформа знала, как получить кэшированные элементы пользовательского интерфейса для текущего отображаемого элемента в данной ячейке таблицы. Это подробно объясняется в javadoc для функции cache.
Если у вас есть поле идентификатора в вашем элементе, вы можете использовать его, например:
cache(rowItem.id) { }
Вы даже можете использовать значение для ячейки, если оно уникально:
cache(it) { }
Использование второго примера заставило меня работать. Спасибо!
Прежде всего, спасибо за ответ, поэтому, если у меня есть класс, атрибут «имя» которого уникален, я могу использовать
cache(it.name) {}или я неправильно понял?