I have an AutoCompleteTextView in my layout. I also have an alternative way to select the same items which are present in the AutoCompleteTextView. When the alternative way is
This works fine for me and is less complex:
ListAdapter adapter = autoCompleteTextView.getAdapter();
autoCompleteTextView.setAdapter(null);
autoCompleteTextView.setText("whatever");
autoCompleteTextView.setAdapter(adapter);
If you want to support API<17, Subclass AutoCompleteTextview and override setText(text, filter)
method
@Override
public void setText(CharSequence text, boolean filter) {
if(Build.VERSION.SDK_INT>=17) {
super.setText(text, filter);
}else{
if(filter){
setText(text);
}else{
ListAdapter adapter = getAdapter();
setAdapter(null);
setText(text);
if(adapter instanceof ArrayAdapter)
setAdapter((ArrayAdapter) adapter);
else
setAdapter((CursorAdapter) adapter);
//if you use more types of Adapter you can list them here
}
}
}
Then whenever you want to set the text manually call setText(text, false)
My solution (but I don't like it, there must be something better):
autoCompleteTextView.setText(valueFromAlternativeSource);
autoCompleteTextView.setDropDownHeight(0);
autoCompleteTextView.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
autoCompleteTextView.setDropDownHeight(LayoutParams.WRAP_CONTENT);
}
}
autoCompleteTextView.setText(valueFromOtherMeans, filter);
* @param filter If <code>false</code>, no filtering will be performed
* as a result of this call.
Looks like its a problem of the order how messages are processed. My work around looks like this:
//autoCompleteTextView.dismissDropDown();
new Handler().post(new Runnable() {
public void run() {
autoCompleteTextView.dismissDropDown();
}});