2011-12-20 9 views
8

Este es mi adaptador personalizado heredado de BaseAdapter:¿Cómo implementar filtros para BaseAdapter personalizado con ListView?

public class LocationItemAdapter extends BaseAdapter implements Filterable { 
    private Activity context; 
    private String[] names; 
    private Bitmap[] iconBitmaps; 
    private String[] categories; 
    private String[] ratings; 
    private boolean notifyChanged = true; 

    public LocationItemAdapter(Activity activityContext, String[] names, Bitmap[] iconBitmaps, String[] categories, String[] ratings) { 
     super(); 
     this.context = activityContext; 
     this.names = names; 
     this.iconBitmaps = iconBitmaps; 
     this.categories = categories; 
     this.ratings = ratings; 
    } 

    public int getCount() { 
     return names.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public static class ItemViewHolder { 
     TextView nameTextView; 
     TextView categoryTextView; 
     TextView ratingTextView; 
     ImageView mapIconImageView; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ItemViewHolder holder; 
     LayoutInflater inflater = context.getLayoutInflater(); 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.location_item, null); 
      holder = new ItemViewHolder(); 
      holder.nameTextView = (TextView) convertView.findViewById(R.id.location_item_xml_textview_name); 
      holder.categoryTextView = (TextView) convertView.findViewById(R.id.location_item_xml_textview_category); 
      holder.ratingTextView = (TextView) convertView.findViewById(R.id.location_item_xml_textview_rating); 
      holder.mapIconImageView = (ImageView) convertView.findViewById(R.id.location_item_xml_imageview_location_icon); 

      convertView.setTag(holder); 
     } 
     else { 
      holder = (ItemViewHolder) convertView.getTag(); 
     } 

     holder.nameTextView.setText(names[position]); 
     holder.categoryTextView.setText(categories[position]); 
     holder.ratingTextView.setText(ratings[position]); 
     holder.mapIconImageView.setImageBitmap(iconBitmaps[position]); 

     return convertView; 
    } 

    public void notifyDataSetChanged() { 
     super.notifyDataSetChanged(); 
     notifyChanged = true; 
    } 

    public android.widget.Filter getFilter() { 
     return new android.widget.Filter() { 
      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults results = new FilterResults(); 
       if (constraint != null && constraint.toString() > 0) { 

       } 
       else { 
       } 
       results.values = filteredResults; 
       return results; 
      } 
     }; 
    } 
} 

Busqué y encontré que las dos funciones que necesito para poner en práctica son:

  1. protected void publishResults(CharSequence constraint, FilterResults results)
  2. protected FilterResults performFiltering(CharSequence constraint)

Mi restricción de filtro es la matriz de cadena "nombre", y supongo que performFiltering funcionaría una búsqueda basada en el texto "restricción". Lo que me confundió es que el tipo de results.value es object. Entonces, después de realizar una búsqueda en name, ¿qué tipo de datos debo asignar a results.values? ¿Y qué hace la función publishResults? ¿Alguien podría darme un ejemplo sobre estas dos funciones? Gracias de antemano,

+0

¿Ha verificado la respuesta a continuación. Funciona perfectamente para mí. – blganesh101

Respuesta

2

Usted podría hacer lo siguiente en el performFiltering

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

       names = results.values(); // copy the results to your original names and refresh list 
       notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      String [] resultNames=new String[names.length]; 
      int count=0; 

      if (constraint != null && constraint.toString() > 0) { 
        for(String name:names) 
        { 
         if(name.contains(constraint)) // whatever search condition you need 
          resultNames[count++]=name; 
        } 
      } 
      else { 

      } 
      results.values = resultNames; 
      return results; 
     } 
Cuestiones relacionadas