Как я могу избежать появления раскрывающегося списка автозаполнения, когда текст задан программно?

У меня есть AutoCompleteTextView в моем макете. У меня также есть альтернативный способ выбрать те же элементы, которые присутствуют в AutoCompleteTextView. Когда выбран альтернативный способ, я заполняю значение в AutoCompleteTextView с помощью:

autoCompleteTextView.setText(valueFromAlternativeSource);

где valueFromAlternativeSource — один из допустимых вариантов автозаполнения. Проблема в том, что раскрывающийся список автозаполнения появляется при вызове setText. Помещение следующей строки после вышеприведенного не работает:

autoCompleteTextView.dismissDropDown();  //Doesn't work.  Why?

Любые идеи о том, почему раскрывающийся список закрытия не работает или как я могу закрыть раскрывающийся список?


person Chris Knight    schedule 17.09.2011    source источник
comment
Ваше решение не работает, потому что метод setText(CharSequence) запускает асинхронную работу. Всякий раз, когда текст изменяется, фильтр адаптера используется для фильтрации возможных предложений для отображения. Так как фильтр может выполняться долго, он вызывается асинхронно. Некоторое время спустя фильтр возвращается, и его результаты отображаются, когда поток пользовательского интерфейса снова получает время обработки. К этому моменту метод rejectDropDown() уже давно завершен, поэтому этот метод не имеет никакого эффекта. Источник: grokkingandroid.com/   -  person Singed    schedule 04.01.2016


Ответы (5)


Если вы хотите поддерживать API‹17, подкласс AutoCompleteTextview и переопределить метод setText(text, filter)

@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
        }
    }
}

Затем, когда вы хотите установить текст вручную, вызовите setText(text, false)

person martinpelant    schedule 09.05.2014
comment
Лучший ответ здесь только для поддержки API‹17! - person Petro; 23.03.2015

Это отлично работает для меня и менее сложно:

ListAdapter adapter = autoCompleteTextView.getAdapter();
autoCompleteTextView.setAdapter(null);
autoCompleteTextView.setText("whatever");
autoCompleteTextView.setAdapter(adapter);
person drlue    schedule 27.02.2013
comment
отлично, но мне нужно снова назначить адаптер, прежде чем установить адаптер, и он отлично работает для показа скрытия - person Noor Hossain; 16.10.2020

Похоже, это проблема порядка обработки сообщений. Моя работа выглядит следующим образом:

//autoCompleteTextView.dismissDropDown();
new Handler().post(new Runnable() {
    public void run() {
        autoCompleteTextView.dismissDropDown();
}});
person Gene    schedule 26.03.2012

Мое решение (но мне оно не нравится, должно быть что-то лучше):

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);
   }
}
person Arie    schedule 16.03.2012

person    schedule
comment
Было бы неплохо, если бы вы добавили немного прозы в свой ответ. - person faceman; 22.03.2013