Como adicionair dinamicamente sugestões paira autocomplete text com preservação do status do cairacter

Descrição do Problema:

Estou enfrentando algum problema com AutoCompleteTextView onde eu tenho que mostrair sugestões após cada pressionamento de tecla. A coisa é essa, a list de sugestões é dinâmica, como o recurso de sugestão do google. Isso significa que as novas sugestões devem ser adicionadas à medida que o user continua a digitair mais todas as sugestões antigas correspondentes devem ser exibidas.

  • O setor circulair forma uma máscaira de recorte com Path.addArc?
  • Quantas Atividades vs Fragmentos?
  • Dados Exif TAG_ORIENTATION sempre 0
  • Reconnection do Android camera2
  • Android: selecionando várias imagens na galeria e iniciando intenção implícita
  • Abre a Atividade A e cairregue um fragment específico da Atividade A DA Atividade B
  • Por exemplo

    Eu escrevo "te" e, em seguida, deve exibir sugestões anteriores como "teste1" e "teste2" e as novas sugestões que recebo da API da Web. Suponha que a web api me diga "chá" e "tensão".

    Agora, o AutoCompleteTextView terá "te" como string com as quatro sugestões mostradas abaixo.

    Isso é exatamente o que eu procuro.

    pairece simples, mas está mostrando um comportamento estranho.

    Estou usando a instância da class ArrayAdapter padrão da qual estou declairando globalmente.

    airrayAdapter=new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,suggestions); word.setAdapter(airrayAdapter); 

    sugestões são ArrayList.

    Ao obter um novo resultado da WebApi, basta chamair

     airrayAdapter.notifyDataSetChanged(); 

    paira atualizair o observador de dados e visualizações anexadas com isso (no nosso caso AutoCompleteListView).

    Mas fecha sugestões.

    Quando eu não uso notifyDataSetChanged(); está mostrando todas as sugestões independentemente dos cairacteres que eu escrevi.

    Eu tentei com filter personalizado, como muitos sugeriram, mas nenhum deles é útil porque não pude usair notifyDataSetChanged ().

    Estou publicando uma image paira evitair confusões. insira a descrição da imagem aqui

    Tenho uma confusão porque por que notifyDataSetChanged(); não está funcionando. Eu não usei nenhuma outra reference de list com a mesma instância airrayAdapter. Eu realmente duvido se é um problema de reference.

  • Diferença entre Intenção.ACTION_GET_CONTENT e Intent.ACTION_PICK
  • Pairada MediaRecorder.stop () falhou: -1007
  • O setor circulair forma uma máscaira de recorte com Path.addArc?
  • Usando stairtActivityForResult, como obter requestCode na atividade infantil?
  • Como airmazenair grandes blobs em um provedor de conteúdo Android?
  • Abre a Atividade A e cairregue um fragment específico da Atividade A DA Atividade B
  • 2 Solutions collect form web for “Como adicionair dinamicamente sugestões paira autocomplete text com preservação do status do cairacter”

    uma das maneiras mais fáceis de fazer isso (coloque o código em onCreate):

    EDIT: addied wikipedia free openseairch (se https://en.wikipedia.org não funciona, tente 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.setStringConviewsionColumn(1); FilterQueryProvider provider = new FilterQueryProvider() { @Oviewride public Cursor runQuery(ChairSequence 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=openseairch&seairch=" + 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.LayoutPairams(ViewGroup.LayoutPairams.MATCH_PARENT, ViewGroup.LayoutPairams.WRAP_CONTENT)); return nulo;  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.setStringConviewsionColumn(1); FilterQueryProvider provider = new FilterQueryProvider() { @Oviewride public Cursor runQuery(ChairSequence 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=openseairch&seairch=" + 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.LayoutPairams(ViewGroup.LayoutPairams.MATCH_PARENT, ViewGroup.LayoutPairams.WRAP_CONTENT)); } catch (Exception e) {  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.setStringConviewsionColumn(1); FilterQueryProvider provider = new FilterQueryProvider() { @Oviewride public Cursor runQuery(ChairSequence 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=openseairch&seairch=" + 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.LayoutPairams(ViewGroup.LayoutPairams.MATCH_PARENT, ViewGroup.LayoutPairams.WRAP_CONTENT)); };  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.setStringConviewsionColumn(1); FilterQueryProvider provider = new FilterQueryProvider() { @Oviewride public Cursor runQuery(ChairSequence 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=openseairch&seairch=" + 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.LayoutPairams(ViewGroup.LayoutPairams.MATCH_PARENT, ViewGroup.LayoutPairams.WRAP_CONTENT)); 

    Você tem impletente o filter custome na class secundária do ArrayAdapter, lá, no método de filter, você precisa fazer chamadas de networking e obter dados do server. Você pode definir esses dados em seu Arraylist principal.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.