20

I'm using Android's AutoCompleteTextView with a CursorAdapter to add autocomplete to an app. In the view's onItemClickListener() (i.e. when the user touches one of the autocompleted drop down items) I retrieve the text and place it in the EditText so that the user can modify it if they need to.

However, when I call setText() on the TextView the autocomplete behavior is triggered and the dropdown shows again. I'd like to only show the dropdown if the user types new text with the keyboard. Is there a way to do this?

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
magneticMonster
  • 2,373
  • 6
  • 30
  • 46
  • I am doing something similiar HERE!!! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – Etienne Lawlor Oct 30 '12 at 19:45

5 Answers5

21

You can use the dismissDropDown() method of the AutoCompleteTextView object. Take a look at the documentation.

Franziskus Karsunke
  • 4,948
  • 3
  • 40
  • 54
9

When we click on item suggested in AutoCompleteTextView.onTextChanged() is performed before onItemClick So, to avoid this try below code..

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) {

    }
});
Ketan Ramani
  • 4,874
  • 37
  • 42
7

If you wish to dissmis AutoCompleteTextView's dropdown you should use its post(Runnable r) method. It works for me :)

Here is an example:

mAutoCompleteTextView.post(new Runnable() {
    public void run() {
        mAutoCompleteTextView.dismissDropDown();
    }
}
Toochka
  • 894
  • 1
  • 9
  • 25
4

Answering my own question after a couple hours of hacking at this: It turns out you should implement your own OnItemClickListener and instead rely on the existing click listener to populate the TextView. I had originally implemented the onItemClickListener because it was using the results of Cursor.toString() to populate the text view. To change the output String, you should implement convertToString(Cursor) in your CursorAdapter. The CharSequence that gets returned will be populated in the text view.

Doing this will also prevent the dropdown from showing up again (since setText() triggers the completion behavior but the default onItemClickListener does not).

magneticMonster
  • 2,373
  • 6
  • 30
  • 46
  • What if my adapter extends `BaseAdapter`, not `CursorAdapter`? I do not have such method, but I have the same issue (I override `getFilter` method). – Vadim Kotov Jul 25 '19 at 08:06
  • Ah, found it: you need to override [Filter.convertResultToString](https://developer.android.com/reference/android/widget/Filter.html#convertResultToString(java.lang.Object)) to provide String representation. – Vadim Kotov Jul 25 '19 at 08:19
1

Different approach. I agreed dismissDropDown() works but in my case, it wasn't working as expected. So, I used:

autoCompleteTextView.setDropDownHeight(0);

And if you want to show the dropdown list again, you an use

autoCompleteTextView.setDropDownHeight(intValue);
CopsOnRoad
  • 237,138
  • 77
  • 654
  • 440
  • Yeah I tried this also but how do I know `intValue`? It's different with each search mate :) – Vucko Jul 04 '18 at 12:45
  • In my case, I was using a hard coded value. This is like a max value and if you have less items for a particular choice, the height will reduce to make up with your new choices. So, there is like no disadvantage of using a hard coded value. – CopsOnRoad Jul 06 '18 at 09:07
  • this technically works but you'll see the dropshadow still. It's quite ugly. – John Lord Sep 13 '22 at 17:14