簡體   English   中英

ListView過濾器僅適用於第一項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM