2012-04-04 20 views
12

Sembra che il caso d'uso di un Adapter che è Filterable è quello di filtrare da un String o CharSequence che potrebbe essere immesso dall'utente in un EditText, ma questo è davvero l'unico criterio la piattaforma offre per il filtraggio Adapter s?Filtro elenco annunci diverso dall'uso di stringhe?

Cosa succede se ho una struttura di dati di supporto di oggetti che possono essere altrimenti classificati? per esempio, cosa succede se ho una lista di oggetti Shirt che hanno un attributo enum, color? L'utente dovrebbe essere in grado di filtrare l'elenco di camicie da un elenco di color s disponibili. Come un buon sviluppatore di applicazioni voglio usare le piattaforme integrate nel meccanismo di filtraggio, ma tutto quello che riesco a trovare è questo Filter con metodi come filter (CharSequence constraint). Devo mancare qualcosa. Vedo come sarebbe abbastanza semplice implementare questo meccanismo di filtraggio all'interno della mia consuetudine BaseAdapter, ma sembra che ci debba essere un modo per realizzare filtri personalizzati. Chiunque? Grazie in anticipo.

+0

FacebookSDK 3.0 ha un modo di filtrare su altri parametri. Il problema è che hanno implementato la nuova classe di filtri da zero. Controllare PickerFragment.GraphObjectFilter per ulteriori dettagli. – mach

+1

Non posso credere che questa domanda non abbia più opinioni e voti. La realtà dietro la domanda dell'OP sottolinea un'esclusione completamente idiota dal core framework di Android. Filtraggio su qualcosa di diverso da String? Chi diavolo ne ha bisogno? Incredibile – wkhatch

risposta

0

In Android, la scheda può implementare il filtrabili (che può essere lo stesso con il filtro che hai cercato)
=> Questo è il collegamento tra i dati con il filtro.
ecco il link [Si dovrebbe vedere la risposta segnata] List View Filter Android

0

è possibile creare il proprio FilterAdapter e portare le proprie logiche, ad esempio, questo prendersi cura di oggetto con due stringhe e gestire il filtro:

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

}

l'adattatore mettere questo:

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