我正在尝试提供一个动态搜索栏,您可以在其中键入内容,它将使用搜索结果更新ListView
。到目前为止,我所拥有的是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
。
我尝试使用单独的列表存储结果以及使用搜索栏之前填充列表的技能,这不会改变任何内容。如何正确地执行此动态搜索功能?
编辑:我正在使用CellFactory
在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);
}
}
});