2012-10-16 18 views
13

私の主なアクティビティコード:AutoCompleteTextViewは、ドロップダウンを表示しません

// here you put all your data. 
String[] dataArray = { "Amit sharma Kumar", "Hisham Kumar Munner", 
     "Vineet John Chaturvedi", "Lucky Kumar Verma" }; 

ArrayList<String> alAutoCompleteList; 
AutoCompleteTextView acTV; 
ArrayAdapter<String> adapter1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // etAuto = (EditText) findViewById(R.id.etAuto); 
    acTV = (AutoCompleteTextView) findViewById(R.id.acTV); 
    // Arraylist 
    alAutoCompleteList = new ArrayList<String>(); 
    adapter1 = new ArrayAdapter<String>(MainActivity.this, 
      android.R.layout.simple_dropdown_item_1line,  alAutoCompleteList); 


    acTV.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 
      if (acTV.enoughToFilter()) { 
       acTV.showDropDown(); 
       acTV.bringToFront(); 
      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 
      alAutoCompleteList.clear(); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

      String acText = acTV.getText().toString().trim(); 

      for (String item : dataArray) { 

       if  (item.toLowerCase().contains(acText.toLowerCase())) { 
        alAutoCompleteList.add(item); 
       } 
      } 


      acTV.setThreshold(4); 
      acTV.setAdapter(adapter1); 
      acTV.showDropDown(); 

     } 
    }); 

私は「シャルマ」を検索し、提案が消灯していることの後にスペースを押してください。私はそれらの提案がそこにとどまることを望む。私はすべてをやろうとしましたが、成功しませんでした。誰かが助けてくれますか?

編集: エミュレータでこのコードを試してもらえますか? AutoCompleteTextViewをxmlに追加して実行してください。

答えて

14

まず、TextWatcherリスナーをAutoCompleteTextViewに設定する理由はありますか?これを行って自分でデータをフィルタリングした場合は、(ウィジェットがデフォルトでこれを行い、コードが間違っているため)データをフィルタリングするべきではありません。

「シャルマ」を検索し、それ以降のスペースを押すと、提案は になります。私はそれらの提案がそこにとどまることを望む。

これは、アダプタとそれに付属しているデフォルトFilter実装、AutoCompleteTextViewはあなたがドロップダウンリストに表示値を提供するためにボンネットの下に使用する要素で起こっています。 ArrayAdapterのデフォルト動作は、表示されている動作です。this answerに説明があります。解決策は、アダプターの行データ全体をフィルター文字列で検索するフィルターを使用して、独自のアダプターを実装することです。私はArrayAdapterクラスのコードをSDKから取り出して、単語の後にスペースを挿入するときにフィルタリングが壊れないように少し調整しました。コードは大きく掲示するので、クラスhereを見つけることができます。ただ、通常のArrayAdapterとして、プロジェクト内のクラスをコピーし、それを使用する:

FilterWithSpaceAdapter<String> adapter1; 
//... 
adapter1 = new FilterWithSpaceAdapter<String>(MainActivity.this, 
      android.R.layout.simple_dropdown_item_1line, dataArray); 
+1

この解決方法は機能しません。空白を書き込む場合は、ドロップダウン候補を閉じます。 – cnbandicoot

+0

@cnbandicootあなたがしていることの詳細を提供する新しい質問をしてください。 – Luksprog

0

私は自動完全なテキストビューは、テキストウォッチャーため、その自動リスナーイベントの必要はありませんでしたので、テキストウォッチャーに問題があると思います。配列の代わりに配列に単純に渡す必要があります。 alAutoCompleteList therにlistの値はありません。あなたはリストに価値を追加したことはありませんでした。

  • あなたが好きですしなければならない次のいずれか alAutoCompleteList.add( "データ1"); alAutoCompleteList.add( "data two");

  • または、dataArrayをアダプタに渡します。 adapter1 =新しいArrayAdapter(MainActivity.this、 android.R.layout.simple_dropdown_item_1line、dataArray);

  • テキストウォッチャーを使用する必要はありません。

1

Textwatcherは必要ありません。AutoCompleteTextViewは、設定したアダプタのフィルタを使用します。デフォルトのアダプタは、toString()を呼び出してエントリをフィルタリングします。もちろん、ユーザーがスペースを入力すると、値は一致しなくなります。このカスタム動作を実装するには、テキストウォッチャーを追加するのではなく、カスタムアダプターを作成してください。引き続きArrayAdapterまたはSimpleAdapterを拡張できます。 getFilter()とpublishResults()を上書きして、カスタムフィルタリング動作(あなたの場合はtrim()呼び出し)を実装します。 Hereまたはhereには、その方法の例があります。

2

AutoCompleteTextViewには独自の方法であるMyWatcherがありますので、最初にTextWatcherAutoCompleteTextViewとする必要はありません。

setThreshold(3); 
final String[] AndroidDesk= getResources().getStringArray(R.array.clothname_arrays); 
ArrayAdapter<String> My_arr_adapter= new ArrayAdapter<String>(getApplicationContext(), 
      android.R.layout.simple_dropdown_item_1line,AndroidDesk);  
    cloths.setThreshold(1); 
    cloths.setAdapter(My_arr_adapter); 
    cloths.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {        
    } 
    }); 
関連する問題