Actualización dinámica de un adaptador AutoCompleteTextView
Quiero cambiar periódicamente las sugerencias dadas por un AutoCompleteTextview obteniendo la lista de un servicio web RESTful y no puedo conseguir que funcione sin problemas. He creado una lista codificada de sugerencias para asegurarse de que está funcionando:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, new String[] {"Hi", "Ho"}); speciesName.setAdapter(adapter);//my autocomplete tv
Tengo un TextWatcher en el textview y cuando el texto cambia que lanza una llamada no-bloqueando para conseguir una nueva lista de sugerencias – esta pieza que consiga una nueva lista está trabajando muy bien. A continuación, quiero restablecer el adaptador, así:
- Estilo en la lista desplegable AutoCompleteTextView
- Android AutoCompleteTextView sugiere alternativa
- Problema de AutoCompleteText obtener valores repetidos en la lista?
- Autocompletar con nombre y número como en aplicaciones de sms nativas Android
- Diacríticos / caracteres internacionales en AutoCompleteTextView
public void setOptionsAndUpdate(String[] options) { Log.d(TAG, "setting options"); //speciesName.setAdapter((ArrayAdapter<String>)null); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, options); speciesName.setAdapter(adapter); }
Este método se llama, pero no funciona: la lista de sugerencias desaparece o las sugerencias mostradas permanecen sin cambios a pesar de la llamada a setAdapter
.
¿Es esto el enfoque correcto? Miré SimpleCursorAdapter
pero no pude ver cómo registrar mi servicio web como proveedor de contenido. (Es de la forma http://www.blah.com/query?term=XX , donde el XX es la entrada de mi aplicación, y la respuesta es un JSON Array de cadenas.)
- Indicador de carga a la derecha en AutoCompleteTextView
- Android: restringir al usuario para seleccionar sólo texto de autocompletado
- cómo combinar DISPLAY_NAME y NUMBER en un CursorAdapter personalizado?
- Cambiar el ancho de AutoCompleteTextView en Android
- Autocompletar texto google lugares api
- Coloque Snackbar en el orden z más alto para evitar ser bloqueado por AutoCompleteTextView desplegable
- AutocompleteTextView de Android con ArrayAdapter y Filter
- Android: AutoCompleteTextView con sugerencias predeterminadas
Así es como actualizo mi AutoCompleteTextView:
String[] data = terms.toArray(new String[terms.size()]); // terms is a List<String> ArrayAdapter<?> adapter = new ArrayAdapter<Object>(activity, android.R.layout.simple_dropdown_item_1line, data); keywordField.setAdapter(adapter); // keywordField is a AutoCompleteTextView if(terms.size() < 40) keywordField.setThreshold(1); else keywordField.setThreshold(2);
Ahora, por supuesto, esto es estático y no se ocupa de una over-the-air sugerencias, pero también puedo sugerirle a notificar al adaptador para los cambios después de asignar a la AutoCompleteTextView:
adapter.notifyDataSetChanged();
Espero que esto ayude.
Siciano
No tuve suerte con adapter.notifyDataSetChanged () al añadir dinámicamente y cambiar los datos en el adaptador. En mi situación, estaba golpeando una API externa de forma asíncrona y obtener una lista de datos de finalización periódicamente.
Este código borra el adaptador y agrega los nuevos datos como era de esperar. Sin embargo, tuve que llamar al método getFilter () para forzar la visualización de los datos. Además, tuve que explícitamente filtro basado en el texto actual en el AutocompleteTextView porque mi llamada api era asincrónico.
adapter.clear(); for (Map<String, String> map : completions) { adapter.add(map.get("name")); } //Force the adapter to filter itself, necessary to show new data. //Filter based on the current text because api call is asynchronous. adapter.getFilter().filter(autocompleteTextView.getText(), null);
Hubo un buen tutorial sobre este tema utilizando datos remotos en la API de Google Map para rellenar un AutoCompleteTextView aquí .
Si necesitas una versión en caché, la recuperé de aquí . El tutorial original se ha eliminado, pero esencialmente necesita escribir un ArrayAdapter con un filtro personalizado de una manera similar a la que se muestra a continuación y asignarla a su AutoCompleteTextView.
Nota: Necesita implementar un método autocomplete () que haga cualquier operación que se requiera para buscar y recuperar de forma síncrona los elementos de autocompletado. Como el filtro se invoca en un subproceso de fondo, esto no bloqueará el subproceso de interfaz de usuario principal.
private class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { private ArrayList<String> resultList; public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } @Override public int getCount() { return resultList.size(); } @Override public String getItem(int index) { return resultList.get(index); } @Override public Filter getFilter() { Filter filter = new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults filterResults = new FilterResults(); if (constraint != null) { // Retrieve the autocomplete results. resultList = autocomplete(constraint.toString()); // Assign the data to the FilterResults filterResults.values = resultList; filterResults.count = resultList.size(); } return filterResults; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results != null && results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } }}; return filter; } }
Puesto que no puedo agregar un comentario, estoy dando una nueva respuesta No hay necesidad de despejar el adaptador o el adaptador que llama. Filtro del filtro (…) … Para actualizar dinámicamente un adaptador de AutoCompleteTextView, agregue simplemente El nuevo elemento al adaptador y setAdapter de nuevo. Para el ejemplo dado en la pregunta original, he intentado lo siguiente y funciona (el código de abajo no muestra la configuración inicial del adaptador, ya que varias respuestas aquí cubren esto. Esto sólo muestra la actualización del adaptador dinámicamente). La actualización del adaptador puede estar junto al código que actualiza la lista asociada con el ArrayAdapter.
adapter.add(String newSuggestion); // this goes inside a loop for adding multiple suggestions speciesName.setAdapter(adapter) ; // speciesName is an AutoCompleteTextView as given in the original question.
- No se encontró cadena de certificados, cómo arreglar y publicar en Google Play Store?
- ¿Cuál es el uso de LOCAL_MODULE_TAGS?