Cómo agregar sugerencias dinámicamente a la vista autocompletar con preservar el estado del carácter

Descripción del problema:

Me enfrenta un problema con AutoCompleteTextView donde tengo que mostrar sugerencias después de cada pulsación de tecla. La cosa es que, la lista de sugerencias es dinámica, como la función de sugerencia de google. Significa que las nuevas sugerencias se deben agregar a medida que el usuario sigue escribiendo y además se deben mostrar todas las sugerencias antiguas que coincidan.

Por ejemplo

Escribo “te” y luego debería mostrar sugerencias anteriores como “test1” y “test2” y las nuevas sugerencias que obtendré de Web API. Supongamos que la API web me da la palabra “té” y “tensión”.

Ahora, AutoCompleteTextView tendrá “te” como cadena con las cuatro sugerencias que se muestran debajo.

Esto es exactamente lo que estoy buscando.

parece simple pero muestra un comportamiento extraño.

Estoy usando la instancia predeterminada de la clase ArrayAdapter de la que estoy declarando globalmente.

arrayAdapter=new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line,suggestions); word.setAdapter(arrayAdapter); 

sugerencias es ArrayList.

Al obtener un nuevo resultado de WebApi simplemente llamo

 arrayAdapter.notifyDataSetChanged(); 

para actualizar el observador de datos y las vistas adjuntas con esto (en nuestro caso AutoCompleteListView).

Pero cierra sugerencias.

Cuando no uso notifyDataSetChanged(); muestra todas las sugerencias, independientemente de los caracteres que he escrito.

Lo probé con filtro personalizado, como muchos sugirieron, pero ninguno de ellos es útil, ya que no pude usar notifyDataSetChanged ().

Estoy publicando una imagen para evitar confusiones. enter image description here

Tengo una confusión sobre por qué notifyDataSetChanged(); no funciona. No he usado ninguna otra referencia de lista con la misma instancia arrayAdapter. Realmente dudo si es un problema de referencia.

una de las maneras más fáciles de hacerlo (ponga el código en Crear):

EDITAR: addied wikipedia opensearch libre (si https://en.wikipedia.org no funciona, pruebe http://en.wikipedia.org )

  AutoCompleteTextView actv = new AutoCompleteTextView(this); actv.setThreshold(1); String[] from = { "name", "description" }; int[] to = { android.R.id.text1, android.R.id.text2 }; SimpleCursorAdapter a = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, null, from, to, 0); a.setStringConversionColumn(1); FilterQueryProvider provider = new FilterQueryProvider() { @Override public Cursor runQuery(CharSequence constraint) { // run in the background thread Log.d(TAG, "runQuery constraint: " + constraint); if (constraint == null) { return null; } String[] columnNames = { BaseColumns._ID, "name", "description" }; MatrixCursor c = new MatrixCursor(columnNames); try { String urlString = "https://en.wikipedia.org/w/api.php?" + "action=opensearch&search=" + constraint + "&limit=8&namespace=0&format=json"; URL url = new URL(urlString); InputStream stream = url.openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); String jsonStr = reader.readLine(); // output ["query", ["n0", "n1", ..], ["d0", "d1", ..]] JSONArray json = new JSONArray(jsonStr); JSONArray names = json.getJSONArray(1); JSONArray descriptions = json.getJSONArray(2); for (int i = 0; i < names.length(); i++) { c.newRow().add(i).add(names.getString(i)).add(descriptions.getString(i)); } } catch (Exception e) { e.printStackTrace(); } return c; } }; a.setFilterQueryProvider(provider); actv.setAdapter(a); setContentView(actv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

Ha implementado el filtro de cliente en la clase secundaria de ArrayAdapter, allí, en el método de filtro de rendimiento, debe hacer una llamada de red y obtener datos del servidor. Puede establecer estos datos en su lista de arrays principal.