2012-07-01 7 views
9

В моем приложении есть момент, который мне нужно заставить показать все элементы в списке предложений, вне зависимости от того, что пользователь набрал. Как я могу это сделать?AutoCompleteTextView force, чтобы показать все элементы

Я попытался что-то сделать с фильтрацией, но для меня, как для фильтрации начинающих, слишком сложно, я пробовал искать учебник для начинающих для фильтрации без везения. Может быть, есть более простой способ заставить показать все предложения?

EDIT: В основном, что было моей идеей, заключается в том, что, когда пользователь вводит что-то, что нет в списке, он показывает все доступные параметры, которые он может иметь.

Я нашел лучший способ проверить погоду ACTV, показанное beign или нет, но 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; 

     } 


} 

И это простой в использовании, просто замените оригинальный адаптер с этим:

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

в моем случае 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

Я отредактировал и попытался объяснить точнее, что Im после – XCoder

-1

Это на самом деле даже проще, чем Сэм. Всякий раз, когда вы хотите, чтобы показать все, просто сделать:

performFiltering("", 0); 

Когда фильтрация заканчивает он будет автоматически отображать выпадающий со всеми видимыми элементами.

+0

Не могли бы вы предоставить немного больше контекста? performFiltering() является защищенным методом класса [Фильтр] (http://developer.android.com/reference/android/widget/Filter.html). Похоже, мне нужно подклассировать фильтр, чтобы получить его. – ge0rg

+0

Я больше не работаю в компании, в которой я был, когда я это написал, и я не касался Android, так как оставил их в декабре, поэтому, к сожалению, у меня больше нет доступа к этому коду в контексте. Сожалею. – ArtOfWarfare

2

метод убедительно показать выпадающий список.

необходимо вызвать запросFocus(); для отображения клавиатуры, иначе клавиатура не появится.

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

Это работает для меня идеально, это простой способ решить эту проблему:

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 намного короче и проще других решений, выполняет свою работу, используя AutoCompleteTextView вместо этого проклятого Spinner, с этим я могу установить подсказку и ошибку и никогда не использовать этот счетчик, спасибо :) – user3718908

+0

Я использовал OnClickListener хотя и установить свойство focusable в false. – user3718908

0

Как «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); 
    } 
} 
1

Если вы хотите немедленно отобразить предложения, вам необходимо переопределить enoughToFilter(), чтобы он всегда возвращал true. Чтобы игнорировать то, что задано в качестве ввода текста, вы должны использовать 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); 
    } 
} 
Смежные вопросы