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();
}});