2012-04-04 8 views
12

Es scheint, dass der Anwendungsfall für ein Adapter die Filterable ist durch ein String oder CharSequence zu filtern, die durch den Benutzer in einem EditText eingegeben werden könnten, aber das ist wirklich das einzige Kriterium der Plattform für die Filterung Adapter s bietet?ListAdapter Filter anders als mit Strings?

Was ist, wenn ich eine Hintergrunddatenstruktur von Objekten habe, die anderweitig kategorisiert werden können? Was passiert zum Beispiel, wenn ich eine Liste von Shirt-Objekten habe, die ein enum Attribut haben, color? Der Benutzer sollte in der Lage sein, die Liste der Hemden aus einer Liste verfügbarer color s zu filtern. Als ein guter Anwendungsentwickler möchte ich die Plattformen verwenden, die im Filtermechanismus eingebaut sind, aber alles, was ich finden kann, ist Filter mit Methoden wie filter (CharSequence constraint). Ich muss etwas verpassen. Ich sehe, wie es einfach genug wäre, diesen Filtermechanismus in meiner eigenen benutzerdefinierten BaseAdapter zu implementieren, aber es fühlt sich an, als ob es einige eingebaute Möglichkeit geben sollte, benutzerdefinierte Filter zu tun. Jemand? Danke im Voraus.

+0

FacebookSDK 3.0 haben eine Möglichkeit, auf andere Parameter zu filtern. Das Problem ist, dass sie die neue Filterklasse von Grund auf implementiert haben. Check PickerFragment.GraphObjectFilter für weitere Details. – mach

+1

Ich kann nicht glauben, dass diese Frage nicht mehr Ansichten und Stimmen hat. Die Realität, die hinter der Frage des OP steht, unterstreicht einen völlig idiotischen Ausschluss vom Core-android-Framework. Filtern auf etwas anderem als String's? Wer zum Teufel braucht das? Nicht zu fassen – wkhatch

Antwort

0

In Android, Ihr Adapter kann implementieren die Filterbare (das kann mit Filtern Sie gleich sein gesucht)
=> Dies ist die Verbindung zwischen Daten mit dem Filter.
Hier ist der Link List View Filter Android

0

Sie Ihre eigenen FilterAdapter erstellen [Sie sollten die markierte Antwort sehen] und Ihre eigene Logik bringen, zum Beispiel das eines Objekts mit zwei Saiten kümmern und verwalten Sie den Filter:

public class TwoWordsFilter extends Filter { 
ArrayList<BranchData> branchDatas = new ArrayList<BranchData>(); 
private BranchDataAdapter branchDataAdapter; 
public TwoWordsFilter(ArrayList<BranchData> branchDatas,BranchDataAdapter branchDataAdapter) { 
    this.branchDatas = branchDatas; 
    this.branchDataAdapter=branchDataAdapter; 
} 

@Override 
protected FilterResults performFiltering(CharSequence constraint) { 
    FilterResults results = new FilterResults(); 
    if (constraint==null || constraint.length()==0){ 
     results.values=branchDatas; 
     results.count=branchDatas.size(); 
    }else { 
     List<BranchData> mBranchDatas=new ArrayList<BranchData>(); 
     for (BranchData branchData : branchDatas) { 
      if (branchData.getBranch_name().trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase()) || 
      branchData.getCity().trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase())){ 
       mBranchDatas.add(branchData); 
      } 
     } 
     results.values=mBranchDatas; 
     results.count=mBranchDatas.size(); 

    } 
    return results; 
} 

@Override 
protected void publishResults(CharSequence constraint, FilterResults results) { 
    if (results.count == 0) 
     branchDataAdapter.notifyDataSetInvalidated(); 
    else { 
     branchDataAdapter.setBranchDatas((ArrayList<BranchData>) results.values); 
     branchDataAdapter.notifyDataSetChanged(); 
    } 
} 

}

in Ihrem Adapter formulieren:

@Override 
public Filter getFilter() { 
    if (twoWordsFilter==null){ 
     twoWordsFilter=new TwoWordsFilter(branchDatas,this); 
    } 
    return twoWordsFilter; 
}