Lás*_*iki 3 java search listview javafx-8
我想在列表视图中搜索,我的代码可以工作,但还不够好。问题是,当我在搜索文本字段中写入几个字符时,不仅会出现结果,而且其余项目也会出现......
代码:
// 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);
Run Code Online (Sandbox Code Playgroud)
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;
}
});
Run Code Online (Sandbox Code Playgroud)
您的问题不在于您的过滤器逻辑。
我认为您的实现很糟糕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("");
}
}
};
Run Code Online (Sandbox Code Playgroud)