2010-02-05 9 views
6

Hé les gars mon premier poste ici ... J'essaie d'écrire un filtre personnalisé pour filtrer l'arraylist dans mon arrayadapter de telle sorte que ma listview est filtrée quand je clique sur le bouton.Android Comment remplacer le filtre de mon ArrayAdapter?

Par exemple, lorsque je clique sur mon bouton

public void onClick(View arg0) { 
      String abc = "abc"; 
      m_adapter.getFilter().filter(abc); 
     } 

Cependant, lorsque je clique sur mon bouton, mon application de manière inattendue. Voici mon code pour l'arrayadapter et le filtre. Aidez-moi, s'il vous plaît.

package com.ntu.rosemobile.searchlist; 

public class ResultsAdapter extends ArrayAdapter<SearchItem> implements Filterable{ 

public ArrayList<SearchItem> subItems; 
public ArrayList<SearchItem> allItems; 
private LayoutInflater inflater; 
private PTypeFilter filter; 

public ResultsAdapter(Context context, int textViewResourceId, ArrayList<SearchItem> items) { 

    super(context, textViewResourceId, items); 
     this.subItems = items; 
     this.allItems = this.subItems; 
     inflater= LayoutInflater.from(context); 
} 

@Override 
public Filter getFilter() { 
    if (filter == null){ 
     filter = new PTypeFilter(); 
    } 
    return filter; 
    } 



//@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 

      v = inflater.inflate(R.layout.listrow, null); 
     } 
     SearchItem o = subItems.get(position); 
     if (o != null) { 
       TextView pname = (TextView) v.findViewById(R.id.productname); 
       TextView neg = (TextView) v.findViewById(R.id.negNum); 
       TextView pos = (TextView) v.findViewById(R.id.posNum); 
       TextView neu = (TextView) v.findViewById(R.id.neuNum); 

       WebImageView productPhoto = (WebImageView)v.findViewById(R.id.pPhoto); 
       if(productPhoto!=null){ 
        productPhoto.setImageUrl(o.getImageUrl().toString()); 
        productPhoto.loadImage(); 
       } 
       if(pname!= null){ 
        pname.setText(o.getProductName().toString()); 
       }      
       if (neg != null) { 
         String a = "" + o.getNegativeReviews(); 
         neg.setText(a);        
       } 
       if(neu != null){ 
        String a = "" + o.getNeutralReviews(); 
        neu.setText(a); 
       } 
       if(pos != null){ 
        String a = "" + o.getPositiveReviews(); 
        pos.setText(a); 
       } 
     } 
     return v; 
} 

private class PTypeFilter extends Filter{ 


    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence prefix, 
            FilterResults results) { 
     // NOTE: this function is *always* called from the UI thread. 
     subItems = (ArrayList<SearchItem>)results.values; 

     notifyDataSetChanged(); 
    } 

    @SuppressWarnings("unchecked") 
    protected FilterResults performFiltering(CharSequence prefix) { 
      // NOTE: this function is *always* called from a background thread, and 
      // not the UI thread. 

      FilterResults results = new FilterResults(); 
      ArrayList<SearchItem> i = new ArrayList<SearchItem>(); 

      if (prefix!= null && prefix.toString().length() > 0) { 

       for (int index = 0; index < allItems.size(); index++) { 
        SearchItem si = allItems.get(index); 
        if(si.getPType().compareTo(prefix.toString()) == 0){ 
        i.add(si); 
        } 
       } 
       results.values = i; 
       results.count = i.size();     
      } 
      else{ 
       synchronized (allItems){ 
        results.values = allItems; 
        results.count = allItems.size(); 
       } 
      } 

      return results; 
    } 
    }  
} 
+1

Vous pourriez vouloir utiliser 'LogCat' et laisser des instructions de débogage à l'intérieur de votre code. "LogCat" est le meilleur pour comprendre pourquoi l'application s'est écrasée de manière inattendue, il vous dira où et pourquoi. –

+0

Comme Anthony a dit, s'il vous plaît donner la trace de la pile. –

+0

salut anthony merci pour la réponse rapide .. theres semble être un index hors de l'exception liée pour mon arraylist ... causé par le .get de l'adaptateur ... y at-il une fonction que j'ai oublié d'écraser? – alan

Répondre

9

Vous devez remplacer la méthode getCount() dans la classe ArrayAdapter.

+0

Comment puis-je faire cela? – heyjii

+0

Créer une classe qui étend le ArrayAdapter, dans leur mettre la méthode 'getCount()'. (Ou juste google pour cette question java générale.) – RaphMclee

+0

Y at-il une documentation pour quelque part? Googling est venu avec des réponses comme ça, mais je ne trouve nulle part où cela montre comment. – Dave