kotlin - TornadoFX 中的列表视图在使用缓存表单时显示重复的项目
问题描述
我正在从 Internet 加载 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 行。
解决方案
使用时,cache
您需要为每个项目指定一个唯一的 id,因此框架知道如何检索给定表格单元格中当前显示的项目的缓存 ui 元素。这在cache
函数的 javadoc 中有详细解释。
如果您的项目中有一个 id 字段,您可以使用它,例如:
cache(rowItem.id) { }
如果这是唯一的,您甚至可以使用单元格的值:
cache(it) { }
推荐阅读
- python - 如何从 pandas 数据框中另一列的多个值创建列中的值列表?
- javascript - 通过包含的单词获取元素
- python - 忽略 tensorflow.python 中未解析的引用
- python - 如何从 Python 运行 SQL Server 脚本
- java - 用 Jackson 序列化 ImmutableMap
- mysql - 为什么当我们使用 python pandas 插入时,mysql varchar 列将 .0 附加到 phonenumer
- ios - Xcode 12 - 当有另一个 Swift 包作为依赖项时,SwiftUI 预览在 Swift 包上不起作用 - 向代理发送“previewInstances”消息
- windows - Windows 驱动程序 - HCK 签名不工作 8/8.1/2012
- git - VIM - coc.vim:没有这样的文件或目录
- python - VSCode:Jupyter 不会导出为 Python 脚本