Pregunta anterior, pero sigue siendo relevante. Siguiendo la guía de algunas otras preguntas, implementó un adaptador personalizado con filtro. Hice un adaptador genérico simple que busca con contains. Notas rápidas sobre él:
Estoy usando butterknife, pero es fácil de hacer el viewHolder con findviewbyid.
El diseño R.layout.list_item_simple es un diseño simple con la vista de texto R.id.text_view_simple.
El objeto necesita un toString que se comparará.
public class SimpleContainsAutocompleteAdapter <T> extends ArrayAdapter<T> implements Filterable {
private List <T> listObjects;
List<T> suggestions = new ArrayList<>();
private int resource;
private Filter mFilter = new Filter(){
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if(constraint != null) {
suggestions.clear();
for(T object : listObjects){
if(object.toString().toLowerCase().contains(constraint.toString().toLowerCase())){
suggestions.add(object);
}
}
filterResults.values = suggestions;
filterResults.count = suggestions.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
if(results == null){
return;
}
List<T> filteredList = (List<T>) results.values;
if(results.count > 0) {
clear();
for (T filteredObject : filteredList) {
add(filteredObject);
}
notifyDataSetChanged();
}
}
};
public SimpleContainsAutocompleteAdapter(Context context, List<T> listObjects) {
super(context, R.layout.list_item_simple, listObjects);
this.listObjects = new ArrayList<>(listObjects);
this.resource = R.layout.list_item_simple;
}
@Override
public Filter getFilter() {
return mFilter;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object listObject = getItem(position);
viewHolder holder;
if(convertView != null) {
holder = (viewHolder) convertView.getTag();
}else{
convertView = LayoutInflater.from(getContext()).inflate(resource, parent, false);
holder = new viewHolder(convertView);
convertView.setTag(holder);
}
holder.name.setText(listObject.toString());
return convertView;
}
static class viewHolder {
@InjectView(R.id.text_view_simple) TextView name;
public viewHolder(View view) {
ButterKnife.inject(this, view);
}
}
}
estoy haciendo algo similar aquí !!! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42