如何避免在AutoCompleteTextView上调用onItemClicked和onTextChanged

我有这个代码。 当我从build议列表中select一个项目时,首先发生onTextChanged,然后是oItemClicked。 现在我想select一个单词时,“onItemClicked”首先出现,然后是“onTextChanged”。 我看了一下Android的文档,但没有提到这个话题。

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

更新:详细地说,这是我想要做的真实的事情。 有些东西与问题题目无关。

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

Solutions Collecting From Web of "如何避免在AutoCompleteTextView上调用onItemClicked和onTextChanged"

在API Level 3中添加了isPerformingCompletion()。它从下拉列表中select了一个项目并且即将触发TextWatcher侦听器后返回true 。 总之,要避免描述的行为:

 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 } 

这个问题没有特别的解决scheme。我会build议你应该把代码放在onclicklistener()里面的textchangedlistener()的开头,这样你想先执行的代码先执行,然后执行代码你想得到执行最后会执行last.Hope这将帮助你。