2012-09-30 3 views
0

J'ai un composant EditText qui recherche une liste à l'aide d'un adaptateur personnalisé. Cela fonctionne bien sauf que les vues filtrées restent à l'écran. Si l'utilisateur supprime tout le texte dans la boîte d'édition, je voudrais que la liste complète retourne à l'écran.affiche la liste complète lorsque la zone EditText est vide

J'ai essayé trois approches:

  1. Je mis une condition dans le Classs filtre de mon adaptateur. Placement notifyDataSetChanged(); dans la fonction FilterResults, et il bloque le programme.

  2. Détection si la zone EditTtext est vide dans l'activité, puis appelez notifyDataSetChanged();. La condition fonctionne parce que je vois System.out.println() imprime du texte à la console. mais cela n'a aucun effet sur listView. Seul le texte filtré reste à l'écran.

  3. Positionnement notifyDataSetChanged(); dans OnTextChanged(). Cela n'a également aucun effet sur la réinitialisation de la liste.

Comment puis-je obtenir le listview pour réinitialiser lorsque la boîte EditText est vide?

code d'activité:

// dans OnCreate

if (searchBox.toString().equals("")){ 
       objAdapter.notifyDataSetChanged(); 


      } 


     searchBox.addTextChangedListener(new TextWatcher(){ 

       @Override 
       public void afterTextChanged(Editable arg0) { 
        // Do nothing 
       } 

       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
        // Do nothing 
       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
        objAdapter.getFilter().filter(s); 

if (s.toString().equals("")){ 

         // objAdapter.notifyDataSetChanged(); fails here 

} 

        } 
       } 

      }); 

code de l'adaptateur.

public class NewsRowAdapter extends ArrayAdapter<Item> { 
    //.... code 
    private class ListFilter extends Filter 
     { 
       @Override 
       protected FilterResults performFiltering(CharSequence constraint) 
       { 
        FilterResults results = new FilterResults(); 
        String prefix = constraint.toString().toLowerCase(); 

        if (prefix == null || prefix.length() == 0) 
        { 

         System.out.println("editText is empty"); 
         // notifyDataSetChanged(); no effect 

         ArrayList<Item> list = new ArrayList<Item>(original); 
         results.values = list; 
         results.count = list.size(); 


        } 
        else 
        { 
         final ArrayList<Item> list = original; 

         int count = list.size(); 
         final ArrayList<Item> nlist = new ArrayList<Item>(count); 

         for (int i=0; i<count; i++) 
         { 
          final Item pkmn = list.get(i); 
          final String value = pkmn.getName().toLowerCase(); 
         if (value.startsWith(prefix)) 
         { 
          nlist.add(pkmn); 
         } 
        } 
        results.values = nlist; 
        results.count = nlist.size(); 
       } 
       return results; 
      } 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       fitems = (ArrayList<Item>)results.values; 

       clear(); 
       int count = fitems.size(); 
       for (int i=0; i<count; i++) 
       { 
        Item pkmn = (Item)fitems.get(i); 
        add(pkmn); 
       } 

       if (fitems.size() > 0){ 
        notifyDataSetChanged(); 
       } else{ 
        notifyDataSetInvalidated(); 
       } 

      } 

     } 

Répondre

1

Au lieu de searchBox.toString(), utilisez searchBox.getText().toString()

searchBox.toString() est de retour Référence VM de l'objet - qui ne sera jamais égal rien

Questions connexes