2010-10-05 8 views
6

J'ai essayé de filtrer ma ListView à partir de ma zone EditText, mais actuellement, cela ne fonctionne pas.Comment filtrer correctement un texte dans un ListView?

J'ai un ListView qui obtient des données correctement et ils sont ajoutés à mon propre ListView en utilisant une classe ArrayAdapter et ma propre classe ArrayList. Quand je par exemple, en tapant "table" je veux trier des titres chargés dans mon ListView et qu'il devrait me montrer les articles qui restent et la table assortie.

Mon code actuel:

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 
    } 

}; 

Bon, alors comment puis-je y parvenir? Lorsque j'entre une valeur dans la zone EditText, tout disparaît, même s'il y a correspondance.

Merci d'avance et dites-moi si vous avez besoin de plus d'extraits de code ou si cette question n'est pas claire!

Répondre

6

Le filtre intégré implémenté par ArrayAdapter convertit l'objet contenu en chaîne en appelant la méthode toString(). C'est cette chaîne qui sera utilisée pour effectuer la correspondance. Si vous essayez uniquement de faire correspondre un champ de chaîne dans votre objet Order, vous pouvez remplacer la méthode toString() pour que votre classe Order renvoie ce champ. Si vous souhaitez effectuer une correspondance plus flexible, comme correspondant à plusieurs champs, consultez cet article qui montre comment créer un filtre personnalisé:

Custom filtering in Android using ArrayAdapter

+0

Non, il n'a pas. J'apprécie vraiment une solution de code plus spécifique à ma question, puisque le lien ci-dessus introduit des parties de code qui ne me sont pas nécessaires, et il n'est pas nécessaire de créer un filtre personnalisé puisque mon ArrayAdapter a déjà son filtre. – Curtain

+0

Le filtre intégré implémenté par ArrayAdapter convertit l'objet contenu en chaîne en appelant la méthode toString(). C'est cette chaîne qui sera utilisée pour effectuer la correspondance. Si vous essayez uniquement de faire correspondre un champ de chaîne dans votre objet Order, vous pouvez remplacer la méthode toString() pour que votre classe Order renvoie ce champ. Si vous souhaitez effectuer des correspondances plus flexibles, telles que la correspondance de plusieurs champs, le message que j'ai mentionné pourrait vous aider, car il crée une classe de filtre personnalisée. – onlygo

+0

Cela l'a résolu. – Curtain

Questions connexes