我正在尝试有一个动态搜索栏,您可以在其中键入,它会ListView
使用搜索结果更新 a 。到目前为止,我所拥有的是一个监听器TextField
和一个在每次修改搜索栏时运行的查询集:
search.textProperty().addListener((observable, oldValue, newValue) -> {
TypedQuery<Skill> query = em.createQuery
("SELECT p FROM Skill p WHERE p.skill_name LIKE '%" + newValue + "%'", Skill.class);
lv.getItems().clear();
skill_list.clear();
skill_list.addAll(query.getResultList());
lv.getItems().addAll(skill_list);
});
这样做的问题是,一旦发现任何匹配项少于数据库中的技能总数(目前为 3 个用于测试),它总是在 中显示三个技能,ListView
尽管清除所有内容并确保查询的结果也只有 1。但是,它确实找到了匹配项,并将其放在顶部,而ListView
不会删除甚至不在查询中的任何额外内容resultList
。
我尝试使用单独的列表来存储结果以及在使用搜索栏之前填充列表的技能,这没有任何改变。如何正确使用此动态搜索功能?
编辑:我正在使用 aCellFactory
来显示ListView
. 该代码如下:
lv.setCellFactory(param -> new ListCell<Skill>() {
@Override
protected void updateItem(Skill skill, boolean empty) {
super.updateItem(skill, empty);
if (!empty && skill != null) {
setText(skill.getName());
setStyle(null);
}
}
});