Liste filtern...

izoards

Bekanntes Mitglied
Hallo,

Ich möchte eine einfache Liste (ListView<String>) über ein Textfeld filtern können.
Ich habe dazu folgendes gefunden:
https://code.makery.ch/blog/javafx-8-tableview-sorting-filtering/

Und möchte dies nun an meine Gegebenheiten anpassen.
Leider klappt es mit der gefilterten Anzeige nicht. Ich glaube das Problem liegt daran, dass ich die SortedList nicht mit der ListView "verbinden" kann.

Anbei Mein Versuch:

Java:
public void initialize() {
        // 1. Wrap the ObservableList in a FilteredList (initially display all data).
        FilteredList<String> filteredData = new FilteredList<>(items, p -> true);

        // 2. Set the filter Predicate whenever the filter changes.
        filterField.textProperty().addListener((observable, oldValue, newValue) -> {

            filteredData.setPredicate(items -> {
                // If filter text is empty, display all persons.
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }

                // Compare first name and last name of every person with filter text.
                String lowerCaseFilter = newValue.toLowerCase();

                if (items.toLowerCase().indexOf(lowerCaseFilter) != -1) {
                    System.out.println("gefunden!");
                    return true; // Filter matches first name.
                }
                return false; // Does not match.
            });
        });
        System.out.println("next");
        // 3. Wrap the FilteredList in a SortedList.
        SortedList<String> sortedData = new SortedList<>(filteredData);

        // 4. Bind the SortedList comparator to the TableView comparator.
        //       Otherwise, sorting the TableView would have no effect.
        sortedData.comparatorProperty().bind(list.sorted().comparatorProperty());

        // 5. Add sorted (and filtered) data to the table.
        list.setItems(sortedData);

    }

Denn in Zeile 30 gibt es ein Problem, also der Befehl gibt es so gar nicht....

Die Liste "list" ist eine observableList<String>

Java:
private ObservableList<String> items = FXCollections.observableArrayList();

@FXML
private ListView<String> list;

Im Beispiel wird die filteredList ja an eine TableView gebunden.
Wie kann ich dies an meine ListView binden?

Oder mache ich sonst wo einen Fehler?

Ich hoffe diese Angaben genügen, um den Fehler einzugrenzen...

Besten Dank schon im Voraus für eure Hilfe 🙂
 
Wenn ich den Code so anpasse, dass die Liste jeweils nach dem Filtern direkt neu geschrieben wird, dann funktioniert's

Java:
public void initialize() {
        // 1. Wrap the ObservableList in a FilteredList (initially display all data).
        FilteredList<String> filteredData = new FilteredList<>(items, p -> true);

        // 2. Set the filter Predicate whenever the filter changes.
        filterField.textProperty().addListener((observable, oldValue, newValue) -> {

            filteredData.setPredicate(items -> {
                // If filter text is empty, display all persons.
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }

                // Compare first name and last name of every person with filter text.
                String lowerCaseFilter = newValue.toLowerCase();

                if (items.toLowerCase().indexOf(lowerCaseFilter) != -1) {
                    System.out.println("gefunden!" + items);
                    return true; // Filter matches first name.
                }
                return false; // Does not match.
            });
            SortedList<String> sortedData = new SortedList<>(filteredData);
            list.setItems(sortedData);
        });
        System.out.println("next");
        // 3. Wrap the FilteredList in a SortedList.


        // 4. Bind the SortedList comparator to the TableView comparator.
        //       Otherwise, sorting the TableView would have no effect.
      //  sortedData.comparatorProperty().bind(items.sorted().comparatorProperty());

        // 5. Add sorted (and filtered) data to the table.

    }

Seht Ihr hier Probleme? Ist vermutlich nicht der effektivste Weg, aber ich lade die Liste sowieso bei jeder Anpassung neu.
Die Liste wird auch nicht allzu gross sein, daher denke ich, ist diese Lösung vertretbar?
Oder laufe ich da in Probleme?

Danke für eure Einschätzungen....
 
Probleme wirst du grundsätzlich nicht kriegen, das Vorgehen passt schon.
Eventuell muss ein ListSelectionListener noch angepasst werden, falls du z.B. nach dem Neusetzen der Liste nach Möglichkeit den vorher ausgewählten Wert nochmal auswählst. In dem Fall sollte der Listener wohl nichts machen.
 

Neue Themen


Zurück
Oben