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