Kotlin TornadFX中的listview在使用缓存窗体时显示重复的项

Kotlin TornadFX中的listview在使用缓存窗体时显示重复的项,kotlin,tornadofx,Kotlin,Tornadofx,我正在从internet加载JSON数据,捕获有关项目的数据,如姓名、作者和imageurl。然后我想一个接一个地加载它们,所以我把它们放到listview中。我只将它们作为一个自定义类添加一次,该类只保存这些变量 我有一个问题,这些价值观重复和不出现,因为他们应该。例如,它将加载前5个项目(20个项目中的前5个),并在剩余的15个项目上重复这些项目。我不明白为什么会发生这种情况,也尝试过在listview的项上循环并打印出来,它们都不一样,也尝试过在它们上执行refresh(),但似乎没有任何

我正在从internet加载JSON数据,捕获有关项目的数据,如姓名、作者和imageurl。然后我想一个接一个地加载它们,所以我把它们放到listview中。我只将它们作为一个自定义类添加一次,该类只保存这些变量

我有一个问题,这些价值观重复和不出现,因为他们应该。例如,它将加载前5个项目(20个项目中的前5个),并在剩余的15个项目上重复这些项目。我不明白为什么会发生这种情况,也尝试过在listview的
项上循环并打印出来,它们都不一样,也尝试过在它们上执行refresh(),但似乎没有任何改变

我正在添加一段代码,用于创建listview和填充它的片段

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)
val lv=listview{
主持人{
topAnchor=0.0
底部锚=0.0
leftAnchor=0.0
rightAnchor=0.0
}
蜂窝格式{
图形=缓存{
形式{
字段集{
hbox{
间距=10.0
println(it.name)
println(it.author)
println(it.imgurl)
println(it.desc)
图像视图{
image=image(it.imgurl)
预调宽度(256.0)
预调高度(256.0)
}
vbox{
字段(“名称”){
标签(it.name)
}
字段(“作者”){
标签(it.author)
}
字段(“说明”){
标签{
text=it.desc
愤怒宽度=150
}
}
}
}
}
}
}
}
}
val tmpItems=items.clone()作为ArrayList()
val arr=ArrayList()
用于(单位:m){
arr.add(
项目(
m[“name”].toString(),
m[“作者”].toString(),
m[“desc”].toString(),
m[“imgUrl”].toString()
)
)
}
lv.items.addAll(arr)

我希望输出是20个唯一项,这是
lv.items
中的内容,但显示的结果是5个唯一项在20行中重复出现。

使用
缓存时,需要为每个项指定一个唯一id,因此,框架知道如何检索给定表单元格中当前显示项的缓存ui元素。javadoc中对
缓存
函数进行了详细解释

如果项目中有id字段,则可以使用该字段,例如:

cache(rowItem.id){}

您甚至可以使用单元格的值,如果该值是唯一的:


cache(it){}

首先,谢谢你的回答,所以如果我有一个类,其中属性“name”是唯一的,我可以使用
cache(it.name){}
或者我误解了它吗?使用第二个示例使它对我有效。谢谢