2010-02-05 12 views
6

Hola chicos mi primera publicación aquí ... Estoy tratando de escribir un filtro personalizado para filtrar la lista de arrays en mi arrayadapter de modo que mi lista de lista se filtra cuando hago clic en el botón.Android ¿Cómo sobrescribo el filtro de mi ArrayAdapter?

Por ejemplo, cuando hago clic en el botón de mi

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

Sin embargo, cuando hago clic en el botón de mi, mi aplicación termina de forma inesperada. Aquí está mi código para el arrayadapter y filtro. Por favor, ayúdame.

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

Es posible que desee considerar el uso de 'LogCat' y dejar declaraciones de depuración dentro de su código. 'LogCat' es el mejor para descubrir por qué la aplicación se bloqueó inesperadamente, le dirá dónde y por qué. –

+0

Como dijo Anthony, por favor, proporcione el seguimiento de la pila. –

+0

Hola, anthony, gracias por la pronta respuesta ... theres parece ser una excepción de indice de límite para mi arraylist ... causada por el .get del adaptador ... ¿hay alguna función que haya olvidado sobreescribir? – alan

Respuesta

9

Debe sobrescribir el método getCount() en la clase ArrayAdapter.

+0

¿Cómo puedo hacer eso? – heyjii

+0

Crea una clase que amplíe el ArrayAdapter, en su puesto el método 'getCount()'. (O simplemente google para esta pregunta general de Java.) – RaphMclee

+0

¿Hay documentación para esto en alguna parte? Google lanzó respuestas como esta, pero no puedo encontrar en ninguna parte donde se muestra cómo. – Dave

Cuestiones relacionadas