ListView过滤器仅适用于第一项

时间:2017-02-04 13:05:46

标签: java listview javafx

我有一个过滤器,可以搜索包含标签(用户名)的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;进入过滤器后,它会过滤掉所有内容。

我该如何解决这个问题?

2 个答案:

答案 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语句以允许它继续搜索。