gpt4 book ai didi

java - ListView 过滤器仅适用于第一项

转载 作者:行者123 更新时间:2023-12-02 03:03:50 25 4
gpt4 key购买 nike

我有一个过滤器,可以搜索包含标签(用户名)数组列表的 ListView :

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第三

每当我在“test”中输入任何字母时,它都会成功过滤掉“third”和“123”,并且仅在ListView中显示“test”;当我输入“t”时,它不应该也显示“third”吗?

此外,当我在过滤器中输入“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));
}
});

关于java - ListView 过滤器仅适用于第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com