2010-10-05 11 views
6

Ho provato a filtrare il mio ListView dalla mia casella EditText, ma attualmente non funziona.Come filtrare correttamente il testo in una ListView?

Ho un ListView che ottiene i dati correttamente e vengono aggiunti al mio ListView utilizzando una classe ArrayAdapter e la mia classe ArrayList. Quando ad esempio, digitando "table", desidero che diventi i titoli caricati nel mio ListView e che dovrebbe mostrarmi gli elementi rimasti e la tabella corrispondente.

mio codice corrente:

private ArrayList<Order> orders; /* ArrayList class with my own Order class to 
define title, info etc. */ 
private OrderAdapter adapter; //Own class that extends ArrayAdapter 

orders = new ArrayList<Order>(); 
adapter = new OrderAdapter(this, R.layout.listrow, orders); /* listrow defining a 
single item in my ListView */ 
setListAdapter(adapter); //Set our adapter to a ListView 

search.addTextChangedListener(filterTextWatcher); //search is my EditText 

private TextWatcher filterTextWatcher = new TextWatcher() { 

    public void afterTextChanged(Editable s) { 

    } 

    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
    } 

    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     adapter.getFilter().filter(s); //Filter from my adapter 
     adapter.notifyDataSetChanged(); //Update my view 
    } 

}; 

Va bene, così come posso raggiungere questo obiettivo? Quando inserisco un valore nella casella EditText scompare tutto, anche se c'è una corrispondenza.

Grazie in anticipo e dimmi se hai bisogno di più frammenti di codice o se questa domanda non è chiara!

risposta

6

Il filtro integrato implementato da ArrayAdapter converte l'oggetto contenuto in stringa chiamando il metodo toString(). È questa stringa che verrà utilizzata per eseguire l'abbinamento. Se si sta tentando di abbinare un campo stringa nell'oggetto Ordine, è possibile sovrascrivere il metodo toString() per la classe Ordine per restituire tale campo. Se si desidera eseguire la corrispondenza più flessibili, come ad esempio corrispondenti più campi, controllare questo post che mostra come creare un filtro personalizzato:

Custom filtering in Android using ArrayAdapter

+0

No, non lo ha fatto. Apprezzo molto una soluzione di codice più specifica alla mia domanda, dal momento che il suddetto link introduce parti di codice che non sono necessarie per me, e, non c'è bisogno di creare un filtro personalizzato poiché il mio ArrayAdapter ha già il suo filtro. – Curtain

+0

Il filtro integrato implementato da ArrayAdapter converte l'oggetto contenuto in stringa chiamando il metodo toString(). È questa stringa che verrà utilizzata per eseguire l'abbinamento. Se si sta tentando di abbinare un campo stringa nell'oggetto Ordine, è possibile sovrascrivere il metodo toString() per la classe Ordine per restituire tale campo. Se si desidera eseguire una corrispondenza più flessibile, ad esempio la corrispondenza di più campi, il post che ho menzionato potrebbe essere d'aiuto, poiché crea una classe di filtro personalizzata. – onlygo

+0

Questo l'ha risolto. – Curtain

Problemi correlati