2011-12-20 16 views
8

Questo è il mio adattatore personalizzato ereditato da BaseAdapter:Come implementare il filtro per BaseAdapter personalizzato 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; 
      } 
     }; 
    } 
} 

Ho cercato e trovato che le due funzioni che ho bisogno di implementare sono:

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

Il mio vincolo di filtro è l'array di stringhe "name" e suppongo che l'esecuzione di performFiltering una ricerca basata sul testo "vincolo". Ciò che mi ha confuso è che il tipo di results.value è object. Quindi, dopo aver eseguito una ricerca su name, quale tipo di dati devo assegnare a results.values? E cosa fa la funzione publishResults? Qualcuno potrebbe darmi un esempio su queste due funzioni? Grazie in anticipo,

+0

Hai verificare la risposta qui sotto. Funziona perfettamente per me. – blganesh101

risposta

2

Si potrebbe fare quanto segue nel 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; 
     } 
Problemi correlati