首页 > 解决方案 > 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 行。

标签: kotlintornadofx

解决方案


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

如果您的项目中有一个 id 字段,您可以使用它,例如:

cache(rowItem.id) { }

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

cache(it) { }


推荐阅读