2012-04-04 19 views
12

Wydaje się, że przypadek użycia dla Adapter że jest Filterable jest filtrowanie przez String lub CharSequence, które mogą być wprowadzone przez użytkownika w EditText, ale jest to naprawdę jedynymi kryteriami platforma oferuje do filtrowania Adapter s?ListAdapter Filtr inny niż za pomocą ciągów znaków?

Co jeśli mam struktury danych podkładową obiektów, które mogą być inaczej sklasyfikować? na przykład, co jeśli mam listę przedmiotów Shirt, które mają atrybut enum, color? Użytkownik powinien mieć możliwość przefiltrowania listy koszulek z listy dostępnych color s. Jako dobry programista aplikacji chcę używać platform wbudowanych w mechanizm filtrowania, ale wszystko, co mogę znaleźć, to Filter z metodami takimi jak filter (CharSequence constraint). Muszę czegoś przegapić. Rozumiem, że byłoby to dość proste, aby zaimplementować ten mechanizm filtrowania w moim własnym niestandardowym BaseAdapter, ale wydaje się, że powinno być trochę wbudowanych w sposób, aby wykonać niestandardowe filtry. Ktoś? Z góry dziękuję.

+0

FacebookSDK 3.0 ma sposób filtrowania innych parametrów. Problem polega na tym, że zaimplementowali nową klasę filtra od podstaw. Sprawdź PickerFragment.GraphObjectFilter więcej szczegółów. – mach

+1

Nie mogę uwierzyć, że to pytanie nie ma więcej wyświetleń ani więcej głosów. Rzeczywistość, jaka kryje się za pytaniem PO, podkreśla całkowicie idiotyczne wykluczenie z głównego systemu Android. Filtrowanie na czymkolwiek innym niż String? Kto do cholery tego potrzebuje? Nie do wiary – wkhatch

Odpowiedz

0

W Androidzie, adapter może wdrożyć z odsączyć (które mogą być takie same z filtrem szukanego)
=> To jest związek między danymi z filtrem.
Oto link [Powinieneś zobaczyć oznaczone odpowiedź] List View Filter Android

0

można stworzyć swój własny FilterAdapter i przynieść własne logiki, na przykład ten dbać o obiekt z dwóch ciągów i zarządzać filtr:

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(); 
    } 
} 

}

w adapterze umieścić to:

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