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();
}
}
Ответы
Ответ 1
В принципе, после 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
Вы не определяете "момент", когда хотите отобразить все результаты, поэтому я надеюсь, что это подходит. Но попробуйте что-то вроде этого:
AutoCompleteTextView autoComplete;
String savedText;
public void showAll() {
savedText = autoComplete.getText().toString();
autoComplete.setText("");
autoComplete.showDropDown();
}
public void restore() {
autoComplete.setText(savedText);
}
Ответ 3
Это отлично работает для меня, это простой способ решить проблему:
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;
}
});
Ответ 4
метод принудительно отображает выпадающий список.
вам нужно вызвать 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;
}
});
Ответ 5
Как предлагается "ArtOfWarfare", вы можете просто подклассифицировать и переопределить executeFiltering():
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);
}
}
Ответ 6
Если вы хотите немедленно отобразить предложения, вам необходимо переопределить 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);
}
}
}
Ответ 7
Это то, что сработало для меня:
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);
}
}
Ответ 8
fun performFilter() {
performFiltering(text, 0)
showDropDown()
}
Мне нужно показать все данные из autocompletetextview после выпадающего меню кнопки (просмотр изображения). Использование класса расширяет AutoCompleteTextView и добавляет эту функцию, оно работает как магия.
Ответ 9
На самом деле это даже проще, чем Сэм. Всякий раз, когда вы хотите показать все, просто выполните:
performFiltering("", 0);
Когда фильтрация закончится, она автоматически отобразит выпадающее меню со всеми видимыми элементами.