19

ユーザーが何を入力したかに関係なく、提案リスト内のすべてのアイテムを強制的に表示する必要がある瞬間があります。どうやってやるの?

フィルタリングで何かをしようとしましたが、初心者のフィルタリングは複雑すぎるので、フィルタリングの初心者向けチュートリアルを検索してみましたが、運がありませんでした。おそらく、すべての提案項目を強制的に表示する簡単な方法はありますか?

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

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();                    
         }                  
}
4

11 に答える 11

15

すべての結果を表示したいときに「瞬間」を定義しないので、これが適合することを願っています。しかし、次のようなことを試してください。

AutoCompleteTextView autoComplete;
String savedText;

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

public void restore() {
    autoComplete.setText(savedText);
}
于 2012-07-01T18:07:04.473 に答える
9

基本的に、いまいましいフィルターがどのように機能するかを理解するために 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;

      }


 }

使い方は簡単で、元のアダプターを次のように置き換えるだけです。

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

私の場合、リストは次のとおりです。ArrayList<String> liste = new ArrayList<String>();

于 2012-07-03T00:03:26.970 に答える
3

「ArtOfWarfare」が示唆するように、サブクラス化して 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);
    }
}

上手に使っています。

于 2016-11-15T22:48:27.467 に答える
3

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

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;
        }
    });
于 2014-09-25T11:43:34.900 に答える