AutocompleteTextView with async suggestions doesn't show dropdown

Eugene Chumak picture Eugene Chumak · May 28, 2012 · Viewed 7.6k times · Source

I add TextChangedListener to AutocompleteTextView. In TextChangedListener's afterTextChanged() I invoke AsyncTask which loads data from web (loading all the data when activity starts is not an option because lists can be pretty large, so it becomes just waste of traffic). AsyncTask's onPostExecute() looks like that (I use 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 is my custom object with overriden toString(). I want my program to start loading data when user starts typing and show results at once they are received and parsed.

My problem:

autocompleteTextView.showDropDown() has no effect. onPostExecute() receives correct list of data, they are added to adapter, but showDropDown() doesn't show the dropdown. What's the matter?

Answer

Awemo picture Awemo · May 29, 2012

I am doing the exact same thing, and I just achieved this functionality. Instead of clearing the adapter and building it individually, set the adapter as below(I do this in a function which is called in the 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();

You do not need to explicitly call showdropdown, the autocomplete view is automatically updated when the adapter notifies it that data has been changed.

You also can call

adapter.setNotifyOnChange(true)

which makes it unnecessary to call

adapter.notifyDatasetChanged()

See setNotifyOnChange Hope I could be of help.