AutoCompleteTextView разрешает только предлагаемые варианты

У меня есть DialogFragment, который содержит кнопки AutoCompleteTextView, Cancel и OK.

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

Что я хочу сделать, так это ограничить пользователя возможностью вводить только существующие имена пользователей.

Я знаю, что могу проверить, существует ли это имя пользователя, когда пользователь нажимает OK, но есть ли какой-то другой способ, скажем, запретить пользователю вводить символ, если такого имени пользователя не существует. Я не знаю, как это сделать, потому что на каждый введенный символ я получаю только до 5 предложений. Так реализован сервер.

Любые предложения приветствуются. Спасибо


person nikmin    schedule 27.08.2013    source источник
comment
Вместо этого используйте Spinner...   -  person Selvin    schedule 27.08.2013
comment
@Selvin Я не могу использовать счетчик, потому что есть МНОГО имен пользователей, и клиент хочет иметь текстовое представление с автозаполнением. Спасибо за ваше предложение   -  person nikmin    schedule 27.08.2013
comment
как насчет просмотра списка с опцией поиска?   -  person Sunil Mishra    schedule 27.08.2013
comment
@SunilMishra Я тоже не могу это использовать. Клиент хочет только автозаполнение, больше ничего :)   -  person nikmin    schedule 29.08.2013


Ответы (1)


Я не мог найти более подходящего решения, чем это:

Я добавил этот прослушиватель смены фокуса

actName.setOnFocusChangeListener(new OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                ArrayList<String> results =
                        ((UsersAutoCompleteAdapter) actName.getAdapter()).getAllItems();
                if (results.size() == 0 ||
                        results.indexOf(actName.getText().toString()) == -1) {
                    actName.setError("Invalid username.");
                };
            }
        }
});

Где метод getAllItems() возвращает ArrayList, содержащий предложения.

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

Также у меня есть такая же проверка при нажатии кнопки OK:

private boolean checkErrors() {

    ArrayList<String> usernameResults =
            ((UsersAutoCompleteAdapter) actName.getAdapter()).getAllItems();

    if (actName.getText().toString().isEmpty()) {
        actName.setError("Please enter a username.");
        return true;
    } else if (usernameResults.size() == 0 || usernameResults.indexOf(actName.getText().toString()) == -1) {
        actName.setError("Invalid username.");
        return true;
    }

    return false;
}

Поэтому, если вид AutoComplete все еще находится в фокусе, проверка ошибок выполняется снова.

person nikmin    schedule 29.08.2013
comment
что такое UsersAutoCompleteAdapter? - person W I Z A R D; 03.09.2014
comment
@Wizard Это мой собственный ListAdapter, который я использую для AutocompleteTextView. Это просто название адаптера. - person nikmin; 04.09.2014
comment
нужна помощь stackoverflow.com/questions/46377123/ - person chris; 23.09.2017