Donnerstag, 3. Januar 2013

GWT: Celltable Filter

GWT 2.5

Will man eine Celltable filtern (sprich Zeilen verschwinden lassen bei denen kein Element der Zeile dem Filterkriterium entspricht) geht das mit Tabellen, die fix sind und auch keine veränderbaren Elemente beherbergen, ziemlich einfach:

Einfach ein Eingabefeld wo der Filterwert eingegeben wird:


  filterTextBox.addKeyUpHandler(new KeyUpHandler() {

   @Override
   public void onKeyUp(KeyUpEvent event) {
    TableFilter.filterTable(allContent, tableDataProvider.getList(),
     filterTextBox.getText());
   }
  });


Dazu die Util Methode, wobei allContent den gesamten Content der Table darstellt:

 public static List<T> filterTable(List<T> allContent, List<T> actTableContent, String filterText) {
  if (!allContent.isEmpty()) {
   for (T entry : allContent) {
    if (!entry.getName().toLowerCase().contains(filterText.toLowerCase())
      && !entry.getText().toLowerCase().contains(filterText.toLowerCase())) {
     actTableContent.remove(entry);
    } else if (!actTableContent.contains(entry)) {
     actTableContent.add(entry);
    }
   }
  } else {
   actTableContent.clear();
  }
  return actTableContent;
 }

Probleme bereitete mir allerdings die Aufgabe, wie filtern wenn der Inhalt nicht fest steht und während verschiedener Filtereinstellungen verändert werden kann durch Eingabe in Zellen, durch hinzufügen oder löschen von ganzen Zeilen? Mit dem obigen Mechanismus müßte ich nach jeder möglichen Veränderung den "allContent" entsprechend anpassen, kann dazu aber nicht die Liste aus dem ListDataProvider verwenden, da diese ja gerade gefiltert sein könnte und deshalb nicht vollständig. Ich suchte also nach einer Möglichkeit Zeilen zu verstecken und fand schließlich eine super Lösung im Blog artiom.pro. Sie funktioniert einwandfrei, vielen Dank für diese Codeschnipsel.

Hier der Link direkt zur Lösung.