Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid getting both called: onItemClicked and onTextChanged on AutoCompleteTextView

Tags:

I have this code. When I choose an item from suggestion list, the onTextChanged happens first, then oItemClicked comes after that. Now I want when choosing a word, the "onItemClicked" appears first, then "onTextChanged". I took a look Android doc but it doesn't mention this topic.

package com.autocompletetest;   import java.util.Arrays; import java.util.List;  import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView;  public class OnItemClickAndOnTextChangedActivity extends Activity implements TextWatcher, OnItemClickListener {     private AutoCompleteTextView textView;      private static final String[] TEMP = new String[] {         "Beep", "Belgium", "Best", "Bubble", "Bye"     };     @Override     protected void onCreate(final Bundle icicle) {         super.onCreate(icicle);         setContentView(R.layout.main);          textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);         textView.setOnItemClickListener(this);         textView.addTextChangedListener(this);         textView.setThreshold(1);          final List<String> list = Arrays.asList(TEMP);          final ArrayAdapter<String> adapter = new ArrayAdapter<String>(                 OnItemClickAndOnTextChangedActivity.this,                 android.R.layout.simple_dropdown_item_1line, list);         textView.setAdapter(adapter);     }      @Override     public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {         System.out.println("OnTextChanged.");     }      @Override     public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {         System.out.println("OnItemClick.");     }      @Override     public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {     }      @Override     public void afterTextChanged(final Editable s) {      }  } 

Update: In detail, this is real thing I want to do. Something is not related to question title.

package com.autocompletetest;   import java.util.Arrays; import java.util.List;  import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView;  public class OnItemClickAndOnTextChangedActivity extends Activity implements TextWatcher, OnItemClickListener {     private AutoCompleteTextView textView;     private boolean itemClicked;      private static final String[] TEMP = new String[] {         "Beep", "Belgium", "Best", "Bubble", "Bye"     };     @Override     protected void onCreate(final Bundle icicle) {         super.onCreate(icicle);         setContentView(R.layout.main);          textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);         textView.setOnItemClickListener(this);         textView.addTextChangedListener(this);         textView.setThreshold(1);          final List<String> list = Arrays.asList(TEMP);          final ArrayAdapter<String> adapter = new ArrayAdapter<String>(                 OnItemClickAndOnTextChangedActivity.this,                 android.R.layout.simple_dropdown_item_1line, list);         textView.setAdapter(adapter);     }      @Override     public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {         System.out.println("OnTextChanged.");          // The below code block does:         // When type a word, make a new ArrayAdapter and set it for textView         // If any of word in suggestion list is clicked, nothing changes, dropdown list not shown.         if(itemClicked) {             itemClicked = false;         } else {             // Create new ArrayAdapter.             // textView is set to new ArrayAdapter.             // textView.showDropDown()         }     }      @Override     public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {         System.out.println("OnItemClick.");         itemClicked = true;     }      @Override     public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {     }      @Override     public void afterTextChanged(final Editable s) {      } } 
like image 856
emeraldhieu Avatar asked Aug 14 '11 07:08

emeraldhieu


1 Answers

isPerformingCompletion() was added in API Level 3. It returns true after an item has been selected from the drop-down list and TextWatcher listeners are about to be triggered. In short, to avoid the behaviour described:

public void onTextChanged(CharSequence s, int start, int before, int count) {     if (autoCompleteView.isPerformingCompletion()) {         // An item has been selected from the list. Ignore.         return;     }      // Your code for a general case } 
like image 169
neek Avatar answered Oct 21 '22 06:10

neek