2010-10-06 9 views
0
 private class NameFilter extends Filter 
    { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      constraint = constraint.toString().toLowerCase(); 
      FilterResults result = new FilterResults(); 
      if(constraint != null && constraint.toString().length() > 0) 
      { 
       ArrayList<Order> filt = new ArrayList<Order>(); 
       ArrayList<Order> lItems = new ArrayList<Order>(); 
       synchronized (this) 
       { 
        lItems.addAll(items); 
       } 
       for(int i = 0, l = lItems.size(); i < l; i++) 
       { 
        Order m = lItems.get(i); 
        if(m.getOrderTitle().toLowerCase().contains(constraint) 
          || m.getOrderTime().toLowerCase().contains(constraint) || 
          m.getOrderPrice().toLowerCase().contains(constraint)) 
         filt.add(m);      
       } 
       result.count = filt.size(); 
       result.values = filt; 

      } 
      else 
      { 
       synchronized(this) 
       { 
        result.values = items; 
        result.count = items.size(); 
       } 
      } 
      return result; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

      filtered = (ArrayList<Order>)results.values; 
      adapter.notifyDataSetChanged(); 
      adapter.clear(); 
      if(!constraint.equals("")){ 
      for(int i = 0; i < filtered.size(); i++){ 
       adapter.add(filtered.get(i)); 
       adapter.setId(i, filtered.get(i).getOrderId()); 
      } 
      } 

      else { 
       if(orders!=null){ 
       for(int i = 0; i < orders.size(); i++){ 
       adapter.add(orders.get(i)); 
       adapter.setId(i, orders.get(i).getOrderId()); 
       } 
       } 
      } 

     } 

    } 

Les éléments de ListView proviennent d'une asyncTask. Lorsque la tâche asynchrone est en cours d'exécution, je souhaite qu'elle cesse d'ajouter des éléments non correspondants. Pour l'instant, s'il avait chargé 5 éléments et que je recherchais avec une chaîne spécifiée, alors quand la tâche asynchrone continue à charger des éléments, elle ajoute automatiquement des commandes à la liste, même s'il n'y a pas de correspondance.N'ajoutez aucun élément s'il ne correspond pas au filtre

Comment puis-je résoudre ce problème?

Merci d'avance et dites-moi si la question n'est pas claire!

Répondre

0

Selon vos questions précédentes ici sur SO, vous pouvez enregistrer onProgressUpdate si votre EditText est vide ou non. S'il contient du texte, filtrez-le à ce moment-là.

@Override 
protected void onProgressUpdate(Integer... i) { 

    CharSequence cs = yourEditText.getText().toString(); //Get text 
    if(!cs.equals("")){ //Check if "cs" contains text 
     adapter.add(orders.get(i[0])); //Add it to the adapter, then...  
     adapter.getFilter().filter(cs); //..do your filtering, and... 
     adapter.notifyDataSetChanged(); //...update your View 
    } 
    else { //Otherwise, just add the order to your adapter.. 
     adapter.add(orders.get(i[0])); 
    } 

} 

Nous ajoutons toujours tous pour vous assurer que toutes les commandes montrent commandes (même si le EditText contient des informations) lorsque EditText est vide.

+0

Merci! C'était utile! – Curtain

Questions connexes