我有一个过滤器,可以搜索包含标签(用户名)的arraylist的列表视图:
public void updateList() {
UserDAO theDAO = new UserDAO();
userList = theDAO.storeUsers();
listView.setItems(userList);
filterField.textProperty().addListener(new ChangeListener() {
public void changed(ObservableValue observable, Object oldVal, Object newVal) {
search((String) oldVal, (String) newVal);
}
});
}
public void search(String oldVal, String newVal) {
if (oldVal != null && (newVal.length() < oldVal.length())) {
listView.setItems(userList);
}
String value = newVal.toUpperCase();
ObservableList<Label> secondList = FXCollections.observableArrayList();
for (Object entry : listView.getItems()) {
boolean match = true;
Label entryText = (Label) entry;
if (!entryText.getText().toUpperCase().contains(value)) {
match = false;
break;
}
if (match) {
secondList.add(entryText);
}
}
listView.setItems(secondList);
}
截至目前,我的ListView包含:
测试 123 第三
每当我在&#34; test&#34;中键入任何字母时,它都会成功过滤掉#34;第三个&#34;和&#34; 123&#34;并且只显示&#34; test&#34;在ListView中;不应该显示&#34;第三&#34;当我输入&#34; t&#34;?
另外,当我输入&#34; 123&#34;或&#34;第三&#34;进入过滤器后,它会过滤掉所有内容。
我该如何解决这个问题?
答案 0 :(得分:2)
最好使用FilteredList
而不是自行进行过滤
此外,在大多数情况下,您应避免使用Node
作为ListView
的项目类型(String
s通常也应该这样做...)。
最后使用类型参数,而不是将项目从Object
转换为Label
(或其他类)。这允许编译器进行一些类型检查,并且通常也会导致更短的代码:
ObservableList<String> originalList = ...
FilteredList<String> filteredList = new FilteredList<>(originalList);
ListView<String> listView = new ListView<>(filteredList);
TextField filterField = new TextField();
filterField.textProperty().addListener((observable, oldValue, newValue) -> {
if (newValue.isEmpty()) {
filteredList.setPredicate(null);
} else {
final String searchString = newValue.toUpperCase();
filteredList.setPredicate(s -> s.toUpperCase().contains(searchString));
}
});
答案 1 :(得分:0)
在挖掘互联网时找到答案 - 我刚刚删除了break语句以允许它继续搜索。