我想在 ListView 中搜索,我的代码可以正常工作但不够好。问题是当我在搜索文本字段中写几个字符时,不仅会出现结果,还会出现其他项目...
代码:
// Wrap the ObservableList in a FilteredList (initially display all data).
FilteredList<Client> filteredData = new FilteredList<>(main.getClientListData(),p -> true);
//Set the filter Predicate whenever the filter changes.
searchUserTF.textProperty().addListener((observable, oldValue, newValue) -> {
filteredData.setPredicate(client ->{
// If filter text is empty, display all persons.
if(newValue == null || newValue.isEmpty()){
return true;
}
// Compare first name and last name of every client with filter text.
String lowerCaseFilter = newValue.toLowerCase();
if(client.getFirstname().toLowerCase().contains(lowerCaseFilter)){
return true; //filter matches first name
}else if(client.getLastname().toLowerCase().contains(lowerCaseFilter)){
return true; //filter matches last name
}
return false; //Does not match
});
});
//Wrap the FilteredList in a SortedList.
SortedList<Client> sortedData = new SortedList<>(filteredData);
//put the sorted list into the listview
clientListView.setItems(sortedData);
ListCell 实现:
clientListView.setCellFactory(new Callback<ListView<Client>, ListCell<Client>>() {
@Override
public ListCell<Client> call(ListView<Client> param) {
final Label leadLbl = new Label();
final Tooltip tooltip = new Tooltip();
final ListCell<Client> cell = new ListCell<Client>(){
@Override
public void updateItem(Client item, boolean empty){
super.updateItem(item,empty);
if(item != null){
leadLbl.setText(item.getFirstname());
setText(item.getFirstname()+" "+item.getLastname());
tooltip.setText(item.getFirstname());
setTooltip(tooltip);
}
}
};
return cell;
}
});
最佳答案
您的问题不在您的过滤器逻辑中。
我认为您有一个糟糕的 ListCell
实现,当它应该不显示任何内容时却没有清除它的文本。
更新
是的,当项目为 null
时,您的单元格渲染器不会清除单元格。尝试这样的事情:
final ListCell<Client> cell = new ListCell<Client>(){
@Override
public void updateItem(Client item, boolean empty){
super.updateItem(item,empty);
if(item != null){
leadLbl.setText(item.getFirstname());
setText(item.getFirstname()+" "+item.getLastname());
tooltip.setText(item.getFirstname());
setTooltip(tooltip);
}
else {
leadLbl.setText("");
setText("");
}
}
};
关于 ListView 中的 JavaFX 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628472/