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í:

 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.)

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. 
  • ¿Cómo uso el método publishResults () al extender los filtros en Android?
  • Android AutoCompleteTextView onItemSelectedListener no se dispara con un teclado bluetooth
  • Cómo configurar setOnClickListener para AutoCompleteTextView?
  • Cómo personalizar el menú desplegable AutoCompleteTextView en Android
  • Eliminar subrayado de AutoCompleteTextView a través de xml
  • Gire AutoCompleteTextView en un SearchView en ActionBar en su lugar
  • Cómo filtrar los resultados de AutoCompleteTextView?
  • Cómo resolver "El contenido del adaptador ha cambiado pero ListView no ha recibido una notificación" excepción
  • Android: AutoCompleteTextView ocultar teclado virtual
  • Combinar Spinner y AutoCompleteTextView
  • ¿Cómo deshabilitar la apertura automática de lista desplegable en AutoCompleteTextView cuando notifyDataSetChanged () se llama?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.