2011-08-14 8 views
20

私はこのコードを持っています。提案リストから項目を選択すると、まずonTextChangedが発生し、次にoItemClickedが発生します。今私は単語を選択するときに、 "onItemClicked"が最初に表示され、次に "onTextChanged"が表示されます。私はAndroidのドックを見ましたが、このトピックは言及していません。両方の呼び出しを回避する方法:onItemClickedとonTextChanged on AutoCompleteTextView

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

    } 
} 
+0

'beforeTextChanged()'が呼び出されたときにチェックされましたか? – Ronnie

+0

なぜOnclickListener()内のすべてのものを行うことができないのですか? – Ronnie

+0

はい、私はしました。 TextWatcherのすべての関数は、onItemClickの前に発生します。 – Emerald214

答えて

75

isPerformingCompletionは、()のアイテムがドロップダウンリストから選択されたとTextWatcherリスナーがトリガされようとしているの後にそれはを返すAPIレベル3で追加されました。要するに、記述された振る舞いを避けるために:

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 
} 
+0

ありがとう、ちょうど私が探していたもの! – Marco

+0

は完璧に動作します!ありがとう、おい! – Scit

+0

ニース、ありがとうございます – Imotep

0

このproblem.Iには、特定のソリューションは、最初の実行uがしたいコードを取得するように、あなたは)textchangedlistener(の初めに内部onclicklistenerにされているコードを()に置く必要があることを示唆しているんでしょうがあります最初に実行され、最後に実行するコードはlast.Hopeを実行します。これが役に立ちます。

+0

実際には、私はブール値のvar "itemClicked"を持って、それは本当の提案リストの項目をクリックします。テキストが変わるたびに「itemClicked」をチェックしたい。問題は..単語がクリックされた後、onTextChangedはonItemClickedの前に発生します。 – Emerald214

+0

あなたは1つのことをすることができます。テキストチェンジが最初に呼び出されるとき、特定の解決策があると言われています。関数内にtextChangedListener()のコードを入れ、onItemClicked()の最後にその関数を呼び出します。私は思う。 –

関連する問題