7

У меня есть DialogFragment, который содержит AutoCompleteTextView и Cancel и OK кнопок.AutoCompleteTextView разрешает только предлагаемые варианты

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

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

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

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

+0

Использовать Spinner вместо этого ... – Selvin

+1

@Selvin Я не могу использовать spinner, потому что есть много имен пользователей, и клиент хочет иметь автозаполнение текста. Благодарим вас за предложение – nikmin

+0

как насчет просмотра списка с помощью опции поиска? –

ответ

10

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

Я добавил этот фокус изменения слушателя

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 вид по-прежнему сфокусирован, проверка ошибок делается снова.

+0

что такое 'UsersAutoCompleteAdapter'? –

+0

@Wizard Это мой пользовательский ListAdapter, который я использую для AutocompleteTextView. Это просто имя адаптера. – nikmin

+0

ok спасибо ........... –

Смежные вопросы