AutoCompleteTextView fuerza para mostrar todos los elementos
Hay un momento en mi aplicación, que necesito forzar a mostrar todos los elementos de la lista de sugerencias, sin importar lo que el usuario haya escrito. ¿Cómo puedo hacer eso?
Intenté hacer algo con el filtrado, pero para mí como un filtrado de principiante es demasiado complicado, traté de buscar tutoriales de principiantes para filtrar sin ninguna suerte. Tal vez, hay una manera más sencilla de obligar a mostrar todos los elementos de sugerencia?
- Excepción "javax.net.ssl.SSLException: No certificado de servidor de confianza" en Android
- Volley - Enviar una solicitud POST con JSONArrayRequest
- Java.lang.ExceptionInInitializerError en Android
- Obtener las líneas de GL10 dibujo de imágenes junto a la otra, la solución?
- ¿Importar Java Project en la aplicación Android?
EDIT: Básicamente lo que fue mi idea, es que, cuando el usuario escribe algo que no está en la lista, muestra todas las opciones disponibles que puede tener.
He encontrado la mejor manera de comprobar el clima el ACTV es beign demostrado o no, pero onTextChangeEvent comparo el texto mecanografiado del usuario con mi lista, y entonces si no se han encontrado los elementos la lista completa de la demostración.
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(); } }
- Java / Android cómo iniciar un AsyncTask después de 3 segundos de retraso?
- LocationClient getLastLocation () devolver null
- Quitar la aplicación del programa de lanzamiento mediante programación en Android
- ¿Cómo puedo saber si mi contexto sigue siendo válido?
- Android Retrofit sin respuesta
- ¿Cómo utilizar otro servicio de reconocimiento de voz en mi dispositivo Nexus 5?
- ListView muestra sólo un elemento
- Android java cambiar imagen dibujable
Usted no define el "momento" cuando desea mostrar todos los resultados, así que espero que esto encaje. Pero pruebe algo como esto:
AutoCompleteTextView autoComplete; String savedText; public void showAll() { savedText = autoComplete.getText().toString(); autoComplete.setText(""); autoComplete.showDropDown(); } public void restore() { autoComplete.setText(savedText); }
Básicamente, después de 5-6 horas de experimentación para entender cómo funciona el maldito filtro, escribí mi propio adaptador que hace exactamente lo que quiero:
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; } }
Y es simple de usar, sólo tiene que reemplazar el adaptador original con esto:
final burtuAdapteris fAdapter = new burtuAdapteris(this, android.R.layout.simple_dropdown_item_1line, liste);
En mi caso lista es: ArrayList<String> liste = new ArrayList<String>();
Método mostrar con fuerza lista desplegable.
Necesita llamar a requestFocus (); Para mostrar el teclado de lo contrario el teclado no aparece.
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; } });
Esto funciona para mí perfectamente, esta es una manera fácil de resolver el problema:
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; } });
Si desea mostrar las sugerencias al instante, entonces tiene que anular enoughToFilter()
para que siempre vuelva true. Para ignorar lo que se da como entrada de texto, debe utilizar performFiltering("", 0)
con un patrón de filtrado vacío. A continuación, AutoCompleteTextView muestra todas las sugerencias.
Esta es la solución que he combinado de otras publicaciones de 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); } } }
Como se sugiere "ArtOfWarfare", sólo puede subclase y reemplazar 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); } }
Esto es lo que funcionó para mí:
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); } }
En realidad es incluso más fácil que Sam enumerados. Siempre que quieras mostrar todo, haz lo siguiente:
performFiltering("", 0);
Cuando finalice el filtrado, mostrará automáticamente el menú desplegable con todos los elementos visibles.
- Obtención del siguiente valor AUTO_INCREMENT de una base de datos SQLite
- Android NotificationManager que me da "ningún icono pequeño válido" error