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:
protected void publishResults(CharSequence constraint, FilterResults results)
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,
¿Ha verificado la respuesta a continuación. Funciona perfectamente para mí. – blganesh101