Intereting Posts
Не удается отменить процесс обнаружения Bluetooth Изменение переменной домашней среды в eclipse Как бороться с Picasso OutOfMemoryError? AdMob не загружает объявления в ионном / угловом приложении Как я могу отправить текстовое поле в запросе POST, который загружает blob в Blobstore и извлекает его в обработчик загрузки для blob? Android два AsyncTasks серийно или параллельно? – Вторая заморозка, но результат в порядке Существуют ли стандартные ярлыки на Android? Android Studio Duplicate файлы, скопированные в APK META-INF / BCKEY.DSA Misbehavior при попытке сохранить набор строк с использованием SharedPreferences Android не может открыть загруженный файл Java.lang.IllegalMonitorStateException: объект не заблокирован потоком перед ожиданием () Соединение было отказано при попытке подключиться к моему серверу REST с эмулятора Android Установить выбранный индекс Android RadioGroup Как создать данные курсора без получения данных из базы данных в приложении Android? Создайте PDFium на Android

AutoCompleteTextView принудительно отображает все элементы

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

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

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

Solutions Collecting From Web of "AutoCompleteTextView принудительно отображает все элементы"

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

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

В принципе, после 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>();

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

Вам нужно вызвать 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; } }); 

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

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

Если вы хотите немедленно отобразить предложения, то вам необходимо переопределить 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); } } } 

Как предлагалось «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); } } 

Это то, что сработало для меня:

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

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

 performFiltering("", 0); 

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