Out of the box, the AutoCompleteTextView widget does not seem to be able to match the input string in the middle of a list value - the matches are always made a
public class AutoCompleteAdapter extends ArrayAdapter implements Filterable {
private List listObjects;
List suggestions = new ArrayList<>();
private Context context;
public AutoCompleteAdapter(Context context, List listObjects) {
super(context, R.layout.list_item_simple, listObjects);
this.listObjects = new ArrayList<>(listObjects);
this.context = context;
}
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 constraint, FilterResults results) {
if(results == null){
return;
}
List filteredList = (List) results.values;
if(results.count > 0) {
clear();
for (T filteredObject : filteredList) {
add(filteredObject);
}
notifyDataSetChanged();
}
}
};
@Override
public Filter getFilter() {
return mFilter;
}
private static class ViewHolder {
TextView title;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object listObject = getItem(position);
final ViewHolder viewHolder; // view lookup cache stored in tag
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.list_item_simple, parent, false);
viewHolder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.title.setText(listObject.toString());
return convertView;
}
}