2012-07-01 13 views
9

ユーザーが入力した内容に関係なく、提案リストのすべての項目を表示する必要があるという瞬間がある。どうやってやるの?AutoCompleteTextViewすべての項目を表示するように強制する

私はフィルタリングで何かをしようとしましたが、初心者のフィルタリングがちょっと複雑すぎるので、私は幸運なしにフィルタリングのための初心者チュートリアルを検索しました。たぶん、すべての提案項目を表示するための簡単な方法がありますか?

EDIT: 基本的に私の考えは、ユーザーがリストにないものを入力すると、利用できるすべてのオプションが表示されます。

私はACTVが表示されているかどうかを確認する最良の方法を見つけましたが、onTextChangeEventはユーザーの入力したテキストと自分のリストを比較し、要素が見つからなかった場合は完全なリストを表示します。

public void onTextChanged(CharSequence s, int start, int before, int count) 
     {     
      final EditText editText = (EditText) findViewById(R.id.vardsUserInput); 
      String strValue = editText.getText().toString().toUpperCase(); 
      String temp; 
      int Cc=0; //my count variable 
      for(int i=0; i<vardi.length; i++) 
      { 
       temp = vardi[i].toUpperCase(); 
       if(temp.startsWith(strValue.toUpperCase())) 
       { 
        Log.d("testing",vardi[i]); 
        Cc++;             
       } 
      }    
     if(Cc == 0) 
     { 
     //Show all the available options 
    textView.showDropDown();      
     }     
} 

答えて

8

、実験の5~6時間後に、私は私が欲しいものを正確に行い、自分のアダプタ書いた:

public class burtuAdapteris extends ArrayAdapter<String> implements Filterable { 

     ArrayList<String> _items = new ArrayList<String>(); 
     ArrayList<String> orig = new ArrayList<String>(); 

     public burtuAdapteris(Context context, int resource, ArrayList<String> items) { 
      super(context, resource, items);  

      for (int i = 0; i < items.size(); i++) { 
       orig.add(items.get(i)); 
      } 
     } 

     @Override 
     public int getCount() { 
      if (_items != null) 
       return _items.size(); 
      else 
       return 0; 
     } 

     @Override 
     public String getItem(int arg0) { 
      return _items.get(arg0); 
     } 


     @Override 

     public Filter getFilter() { 
      Filter filter = new Filter() { 
       @Override 
       protected FilterResults performFiltering(CharSequence constraint) { 

        if(constraint != null) 
         Log.d("Constraints", constraint.toString()); 
        FilterResults oReturn = new FilterResults(); 

       /* if (orig == null){ 
        for (int i = 0; i < items.size(); i++) { 
         orig.add(items.get(i)); 
        } 
        }*/ 
        String temp; 
        int counters = 0; 
        if (constraint != null){ 

         _items.clear(); 
         if (orig != null && orig.size() > 0) { 
          for(int i=0; i<orig.size(); i++) 
          {       
           temp = orig.get(i).toUpperCase(); 

           if(temp.startsWith(constraint.toString().toUpperCase())) 
           { 

            _items.add(orig.get(i));    
counters++; 

           } 
          } 
         } 
         Log.d("REsult size:" , String.valueOf(_items.size())); 
          if(!counters) 
          { 
          _items.clear(); 
          _items = orig; 
          } 
         oReturn.values = _items; 
         oReturn.count = _items.size(); 
        } 
        return oReturn; 
       } 


       @SuppressWarnings("unchecked") 
       @Override 
       protected void publishResults(CharSequence constraint, FilterResults results) { 
        if(results != null && results.count > 0) { 
         notifyDataSetChanged(); 
         } 
         else { 
          notifyDataSetInvalidated(); 
         } 

       } 

      }; 

      return filter; 

     } 


} 

をとそれを使用するのは簡単ですが、これだけでオリジナルのアダプターを交換する:私の場合のLISTEで

final burtuAdapteris fAdapter = new burtuAdapteris(this, android.R.layout.simple_dropdown_item_1line, liste); 

です:ArrayList<String> liste = new ArrayList<String>();

+2

私はコピーして貼り付けているが、あなたの仕事に尊敬の名前BurtuAdapterを残しています。 :) – brainmurphy1

11

すべての結果を表示したいときは「瞬間」を定義しないので、これが当てはまると思います。しかし、このような何かしてみてください:いまいましいフィルタがどのように機能するかを理解することは基本的に

AutoCompleteTextView autoComplete; 
String savedText; 

public void showAll() { 
    savedText = autoComplete.getText().toString(); 
    autoComplete.setText(""); 
    autoComplete.showDropDown(); 
} 

public void restore() { 
    autoComplete.setText(savedText); 
} 
+1

私はこれを試したとき、私は即座に、「残念ながら、このアプリケーションが停止したしまいました" 私は実際に復元機能をどこで使うべきか理解していませんでした。 – XCoder

+0

さて、私はあなたの質問にいくつかの文脈が必要です。あなたがあなたの質問に書いた関連コードを掲示し、すべてを表示したい時を記述してください。 – Sam

+0

私は編集し、より正確に説明しようとしました – XCoder

-1

サムよりもはるかに簡単です。

フィルタリングが終了すると、すべての項目が表示された状態で自動的にドロップダウンが表示されます。

+0

もう少し文脈を提供していただけますか? performFiltering()は[フィルタ](http://developer.android.com/reference/android/widget/Filter.html)クラスの保護されたメソッドです。私はそれを手に入れるためにFilterをサブクラス化する必要があるようです。 – ge0rg

+0

12月にAndroidを放置してからAndroidに手を触れていないので、残念ながら文脈でそのコードにアクセスできなくなりました。ごめんなさい。 – ArtOfWarfare

2

強制的にドロップダウンリストを表示します。

あなたはrequestFocus()を呼び出す必要があります。それ以外の場合はキーボードが表示されません。

autocomptv.setOnTouchListener(new OnTouchListener() { 

     @SuppressLint("ClickableViewAccessibility") 
     @Override 
     public boolean onTouch(View paramView, MotionEvent paramMotionEvent) { 
      // TODO Auto-generated method stub 
      autocomptv.showDropDown(); 
      autocomptv.requestFocus(); 
      return false; 
     } 
    }); 
1

これは完全に私の作品は、これは問題を解決する簡単な方法である:(「ArtOfWarfare」は示唆したように、

final ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_dropdown_item_1line, usernameLists); 
    etUsername.setThreshold(1); 
    etUsername.setAdapter(adapter); 
    etUsername.setOnTouchListener(new View.OnTouchListener() { 

     @SuppressLint("ClickableViewAccessibility") 
     @Override 
     public boolean onTouch(View paramView, MotionEvent paramMotionEvent) { 
      if (usernameLists.size() > 0) { 
       // show all suggestions 
       if (!etUsername.getText().toString().equals("")) 
        adapter.getFilter().filter(null); 
       etUsername.showDropDown(); 
      } 
      return false; 
     } 
    }); 
+0

Lol sooは他のソリューションよりもはるかに短くシンプルですが、このSpinnerの代わりにAutoCompleteTextViewを使用してジョブを完了させます。ヒントとエラーを設定して、スピナーをもう一度使用する必要はありません:) – user3718908

+0

OnClickListener focusableプロパティをfalseに設定します。 – user3718908

0

あなただけのサブクラスすることができますし、performFiltering上書き):

public class My_AutoCompleteTextView extends AutoCompleteTextView { 
    public My_AutoCompleteTextView(Context context) { 
     super(context); 
    } 
    public My_AutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public My_AutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void performFiltering(CharSequence text, int keyCode) { 
     super.performFiltering("", 0); 
    } 
} 
1

提案を即時に表示する場合は、常にtrueを返すようにenoughToFilter()をオーバーライドする必要があります。テキスト入力として与えられるものを無視するには、performFiltering("", 0)に空のフィルタリングパターンを使用する必要があります。 AutoCompleteTextViewはすべての提案を表示します。

これは私が他のStackOverflowの記事から組み合わせてきたソリューションです:

public class InstantAutoComplete extends android.support.v7.widget.AppCompatAutoCompleteTextView { 
    public InstantAutoComplete(Context context) { 
     super(context); 
    } 

    public InstantAutoComplete(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public InstantAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public boolean enoughToFilter() { 
     return true; 
    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 

     if (focused && getAdapter() != null) { 
      performFiltering("", 0); 
     } 
    } 
} 
0

これは私のために働いていたものです:

public class CustomAutoCompleteTextView extends AutoCompleteTextView { 
    public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean enoughToFilter() { 
     return true; 
    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 
     if (focused) { 
      performFiltering(getText(), 0); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     this.showDropDown(); 
     return super.onTouchEvent(event); 
    } 
} 
関連する問題