Отключить Android AutoCompleteTextView после того, как пользователь выберет элемент из раскрывающегося списка

Я использую Android AutoCompleteTextView с CursorAdapter, чтобы добавить автозаполнение в приложение. В представлении onItemClickListener() (т.е. Когда пользователь касается одного из автозаполненных выпадающих элементов), я извлекаю текст и помещаю его в EditText, чтобы пользователь мог изменить его, если ему нужно.

Однако, когда я вызываю setText() в TextView, запускается поведение автозаполнения, и выпадающее меню отображается снова. Я бы хотел показать только раскрывающийся список, если пользователь вводит новый текст с клавиатуры. Есть ли способ сделать это?

Ответ 1

Отвечая на мой собственный вопрос после пары часов взлома на это: Оказывается, вы должны реализовать свой собственный OnItemClickListener и вместо этого полагаться на существующий прослушиватель кликов для заполнения TextView. Первоначально я реализовал onItemClickListener, потому что он использовал результаты Cursor.toString() для заполнения текстового представления. Чтобы изменить выходную строку, вы должны реализовать convertToString(Cursor) в своем CursorAdapter. Возвращаемое CharSequence будет заполнено в текстовом представлении.

Это приведет к тому, что выпадающее меню не появится снова (поскольку setText() запускает поведение завершения, но по умолчанию onItemClickListener не работает).

Ответ 3

Если вы хотите раскрывать раскрывающееся меню AutoCompleteTextView, вы должны использовать метод post (Runnable r). Это работает для меня:)

Вот пример:

mAutoCompleteTextView.post(new Runnable() {
    public void run() {
        mAutoCompleteTextView.dismissDropDown();
    }
}

Ответ 4

Когда мы нажимаем на элемент, предложенный в AutoCompleteTextView.onTextChanged() выполняется перед onItemClick Итак, чтобы избежать этого, попробуйте код ниже.

autocompletetextview.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (autocompletetextview.isPerformingCompletion()) {
            // An item has been selected from the list. Ignore.
        } else {
            // Perform your task here... Like calling web service, Reading data from SQLite database, etc...
        }
    }

    @Override
    public void afterTextChanged(final Editable editable) {

    }
});

Ответ 5

Разный подход. Я согласился, что у dismissDropDown() работает dismissDropDown() но в моем случае он работал не так, как ожидалось. Итак, я использовал:

autoCompleteTextView.setDropDownHeight(0);

И если вы хотите снова отобразить раскрывающийся список, вы используете

autoCompleteTextView.setDropDownHeight(intValue);