2017-02-04 86 views
0

我有一个过滤器,通过含有标签的ArrayList列表视图搜索(用户名):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包含:

测试 third

每当我在“测试”中键入任何字母,它会成功过滤出“第三”和“123”,并且只在ListView中显示“测试”当我输入“t”时,它不应该显示“第三”吗?

另外,当我在过滤器中输入“123”或“third”时,它会过滤掉所有内容。

我该如何解决这个问题?

回答

0

通过互联网挖掘时发现了一个答案 - 我只是删除了break语句以允许它继续搜索。

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)); 
    } 
}); 
相关问题