[英]ListView filter only works on first item
我有一個過濾器,用於搜索包含標簽(用戶名)的數組列表的列表視圖:
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第三
每當我在“測試”中鍵入任何字母時,它都會成功過濾出“第三”和“ 123”,並且僅在ListView中顯示“測試”。 當我輸入“ t”時,它還不應該顯示“第三”嗎?
另外,當我在過濾器中鍵入“ 123”或“ third”時,它會過濾掉所有內容。
我怎樣才能解決這個問題?
最好使用FilteredList
而不是自己進行過濾。
此外,在大多數情況下,您應該避免將Node
用作ListView
項目類型(通常也應該使用String
來完成技巧...)。
最后,使用類型參數,而不是將項目從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));
}
});
在瀏覽互聯網時找到了答案-我只是刪除了break語句,以使其能夠繼續搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.