AutocompleteTextView с асинхронными предложениями не показывает выпадающее меню

Я добавляю TextChangedListener в TextChangedListener . В TextChangedListener afterTextChanged() я AsyncTask который загружает данные из Интернета (загрузка всех данных при запуске активности не является вариантом, потому что списки могут быть довольно большими, поэтому это становится просто тратой трафика). AsyncTask onPostExecute() выглядит так (я использую ArrayAdapter ):

  @Override protected void onPostExecute(ArrayList<Subregion> result) { super.onPostExecute(result); if (result != null) { adapter.clear(); for (Iterator<Subregion> iterator = result.iterator(); iterator.hasNext();) { Subregion subregion = iterator.next(); adapter.add(subregion); } adapter.notifyDataSetChanged(); autocompleteTextView.showDropDown(); } } 

Subregion – это мой пользовательский объект с переопределением toString() . Я хочу, чтобы моя программа начала загружать данные, когда пользователь начинает печатать и показывать результаты сразу после их получения и анализа.

Моя проблема:

autocompleteTextView.showDropDown() не влияет. onPostExecute() получает правильный список данных, они добавляются в адаптер, но showDropDown() не показывает выпадающее showDropDown() . Что случилось?

Solutions Collecting From Web of "AutocompleteTextView с асинхронными предложениями не показывает выпадающее меню"

Я делаю то же самое, и я просто достиг этой функциональности. Вместо того, чтобы очищать адаптер и строить его отдельно, установите адаптер, как показано ниже (я делаю это в функции, которая вызывается в onPostExecute);

 //suggestions is a string array of suggestions. suggestAdapter = new ArrayAdapter<String>(this, R.layout.suggestions, suggestions); //The autocomplete view suggestions.setAdapter(this.suggestAdapter); suggestAdapter.notifyDataSetChanged(); 

Вам не нужно явно вызывать showdropdown, представление автозаполнения автоматически обновляется, когда адаптер уведомляет его о том, что данные были изменены.

Вы также можете позвонить

 adapter.setNotifyOnChange(true) 

Что делает ненужным звонить

 adapter.notifyDatasetChanged() 

См. SetNotifyOnChange Надеюсь, что я могу помочь.

Я также столкнулся с этой проблемой. Мой порог завершения был 2. Когда набрано 2 символа, я извлекал данные с сервера и заполнял адаптер массива, но autoRailwayFrom.showDropDown(); Не показывает падение …

Я просто пишу на линии, и это работает …

 autoRailwayFrom.setText(autoRailwayFrom.getText()); adapterFrom.notifyDataSetChanged(); autoRailwayFrom.showDropDown(); 

На этот вопрос был дан ответ, но я считаю, что не в порядке – ключ для всех – это фильтруемый интерфейс. Здесь у вас есть рабочий пример адаптера, основанный на BaseAdapter. Отсутствующая часть здесь – сообщение (я использовал Retrofit):

 public class UsersAutoAdapter extends BaseAdapter implements Filterable { { DaggerGraphManager.INSTANCE.inject(this); } @Inject CommunicationManager mCommunicationManager; private FindUserResponse mFindUserResponse; @Override public int getCount() { if (mFindUserResponse != null && mFindUserResponse.mUsers != null) { return mFindUserResponse.mUsers.size(); } return 0; } @Override public Object getItem(int i) { return mFindUserResponse.mUsers.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View pView, ViewGroup pViewGroup) { if (pView == null) { LayoutInflater inflater = LayoutInflater.from(pViewGroup.getContext()); pView = inflater.inflate(R.layout.ac_item_user, pViewGroup, false); } TextView textViewUserName = (TextView) pView.findViewById(R.id.text_view_user_name); textViewUserName.setText(mFindUserResponse.mUsers.get(i).mUserName); return pView; } @Override public Filter getFilter() { return new Filter() { //this method is called async (not from UI thread!) so making network request is possible here @Override protected FilterResults performFiltering(CharSequence pCharSequence) { if (pCharSequence != null && pCharSequence.length() >= 3) { FindUserResponse users = mCommunicationManager.findUsersSync(pCharSequence.toString()); FilterResults results = new FilterResults(); results.values = users; results.count = users.mUsers.size(); return results; } return null; } //this is UI thread called method (just after performFiltering returns it's results @Override protected void publishResults(CharSequence pCharSequence, FilterResults pFilterResults) { if (pFilterResults != null) { mFindUserResponse = (FindUserResponse) pFilterResults.values; notifyDataSetInvalidated(); } } }; } }