¿Cómo implementar el filtro para BaseAdapter personalizado con ListView?

Este es mi adaptador personalizado heredado de BaseAdapter:

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 implementar son:

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

Mi restricción de filtro es la matriz de cadenas "name", y supongo que performFiltering realizará una búsqueda basada en el texto "constraint". Lo que me confunde es que el tipo de results.value es un object . Así que después de realizar una búsqueda de name , ¿qué tipo de datos debo asignar a results.values ? ¿Y qué hace la función publishResults ? ¿Podría alguien darme un ejemplo sobre estas dos funciones? Gracias por adelantado,

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; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.