Skip to content

Instantly share code, notes, and snippets.

@estsauver
Created September 4, 2016 15:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save estsauver/3bb3b8ce1cab500804c74019a0ee1c53 to your computer and use it in GitHub Desktop.
Save estsauver/3bb3b8ce1cab500804c74019a0ee1c53 to your computer and use it in GitHub Desktop.
A simple way of limiting auto complete choices to a finite set
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListAdapter;
public class FiniteAutoCompleteTextView extends AutoCompleteTextView {
public FiniteAutoCompleteTextView(Context context) {
super(context);
}
public FiniteAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FiniteAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public FiniteAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@TargetApi(Build.VERSION_CODES.N)
public FiniteAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, Resources.Theme popupTheme) {
super(context, attrs, defStyleAttr, defStyleRes, popupTheme);
}
@Override
public <T extends ListAdapter & Filterable> void setAdapter(T adapter) {
super.setAdapter(adapter);
setValidator(new FiniteValidator<>(adapter));
}
public class FiniteValidator<T extends ListAdapter & Filterable> implements AutoCompleteTextView.Validator {
private T adapter;
public FiniteValidator(T adapter) {
this.adapter = adapter;
}
@Override
public boolean isValid(CharSequence charSequence) {
Filter filter = adapter.getFilter();
for (int i = 0; i < adapter.getCount(); i++) {
Object item = adapter.getItem(i);
CharSequence stringItem = filter.convertResultToString(item);
if (stringItem.toString().equals(charSequence.toString())) {
return true;
}
}
return false;
}
@Override
public CharSequence fixText(CharSequence charSequence) {
Filter filter = adapter.getFilter();
for (int i = 0; i < adapter.getCount(); i++) {
Object item = adapter.getItem(i);
CharSequence stringItem = filter.convertResultToString(item);
if (stringItem.toString().toUpperCase().equals(charSequence.toString().toUpperCase())) {
return stringItem;
}
}
return null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment