просмотр списка в TornadoFX с отображением дублированных элементов при использовании кеш-формы - PullRequest
0 голосов
/ 11 февраля 2019

Я загружаю данные JSON из Интернета, собираю данные об элементах, таких как имя, автор и imageurl.Затем я хочу загрузить их один под другим, чтобы поместить их в список.Я добавляю их только один раз как пользовательский класс, который содержит только эти переменные.

У меня проблема с дублированием этих значений, и они не отображаются должным образом.Например, он будет загружать первые 5 элементов (из 20) и повторять их в течение оставшихся 15. Я не понимаю, почему это происходит, также пытался зацикливаться на массиве listview items и распечатывать их, и онивсе по-другому, также пытался сделать на них функцию 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 строках.

1 Ответ

0 голосов
/ 11 февраля 2019

При использовании cache необходимо указывать уникальный идентификатор для каждого элемента, чтобы инфраструктура знала, как извлечь кэшированные элементы пользовательского интерфейса для отображаемого в данный момент элемента в данной ячейке таблицы.Это подробно объясняется в javadoc для функции cache.

Если в вашем элементе есть поле id, вы можете использовать его, например:

cache(rowItem.id) { }

Вы можете даже использовать значение для ячейки, если оно уникально:

cache(it) { }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...