2012-07-18 17 views
5

Estoy intentando hacer una autocompleta usando AsyncTask con un servidor. Compartí mi código aquí.Autocompletar TextView con Asynctask y servicio web en Android 4

Este es el código para mi AutocompleteTextwatcher:

AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.mainautocomplete); 
textView.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable editable) { 

    } 

    @Override 
    public void beforeTextChanged(CharSequence charSequence, int arg1, int arg2, int arg3) { 

    } 

    @Override 
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) { 
     String text=charSequence.toString(); 
     if (text.length() > 3) { 
      MyAsyncTask myTask = new MyAsyncTask(); 
      try { 
       ArrayList<String> adapterList = new ArrayList<String>(); 
       adapterList=myTask.execute(url).get();/*My Web service url*/ 
       if(!adapterList.isEmpty()){ 
        Log.v("ADPTER LIST",adapterList.toString()); 
        adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item, adapterList); 
        textView.setAdapter(adapter); 
       }else{ 
        Log.v("ADPTER LIST","No VALUES"); 
       } 
      } catch (InterruptedException e) { 
       Log.v("catch",e.getMessage()); 
      } catch (ExecutionException e) { 
       Log.v("catch2",e.getMessage()); 
      } 
     } 
    } 
}); 

Y mi código AsyncTask es,

private class MyAsyncTask extends AsyncTask<String, Void, ArrayList<String>>{ 
    @Override 
    protected void onPreExecute(){ 
     pd = ProgressDialog.show(HomeLayoutActivity.this,"", "Please Wait!"); 
    } 

    @Override 
    protected ArrayList<String> doInBackground(String... params) { 
     try { 
      String myQuery=params[0]; 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpResponse response = null; 
      InputStream is = null; 
      String result = null; 
      StringBuilder sb = null; 

      response = httpClient.execute(new HttpGet(myQuery)); 
      is = response.getEntity().getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
      sb = new StringBuilder(); 
      sb.append(reader.readLine() + "\n"); 
      String line = "0"; 

      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 

      is.close(); 
      result = sb.toString(); 
      JSONArray jArray = new JSONArray(result); 
      JSONObject jData = null; 
      tags.clear(); 

      for (int i = 0; i < jArray.length(); i++) { 
       jData = jArray.getJSONObject(i); 
       tags.add(jData.getString("tagname")); 
      } 
      Log.v("JSON",""+tags.toString()); 

     } catch(Exception e){ 
      Log.v("MUGBUG4",e.getMessage()); 
     } 
     return tags; 
    } 

    @Override 
    protected void onProgressUpdate(Void...strings){ 

    } 

    @Override 
    protected void onPostExecute(ArrayList<String> result){ 
     Log.v("OPE",result.toString()); 
     pd.dismiss(); 
    } 

} 

Mi problema es,

  • puedo capaz de registrar resultados de ArrayList desde AsyncTask (registré y verifiqué). Pero los valores no se muestran en el menú desplegable Autocompletar.
  • Estoy sorprendido aquí, hice la solicitud de autocompletar al servidor web para más de tres caracteres escritos. Una vez que escribe más de 3 caracteres, la solicitud continúa y no se muestra ninguna sugerencia. Pero la sugerencia mostrada para menos de 3 caracteres mecanografiados después de que la solicitud ocurriera.
  • No hay excepciones lanzadas desde mi código.

lo que he intentado es decir,

  • Me trataron de fijar el adaptador en el onPostExecute de AsyncTask. El mismo resultado se muestra.
  • He intentado con el emulador de Android 2.3. Funciona bien.

algún problema con Android 4 y AsynctaskdoInBackground()?

Respuesta

8

Tengo la misma situación. No sé si será útil, pero le recomiendo que agregue estas líneas de código después de agregar su adaptador.

if (!textView.isPopupShowing()) { 
     textView.showDropDown(); 
    } 

Me ayudó. Para ser cierto, no sé la razón exacta de este comportamiento, pero en las implementaciones anteriores de AutoCompleteTextView usaron ListView para mostrar el menú desplegable. En 4.0 (y tal vez antes) comienzan a usar ListPopupWindow. Puede ser esta es la razón. Saludos

+0

que tenían la misma problema, se muestra después de configurar esto antes del adaptador, pero ¿qué ocurre con notifyDataSetChanged()? Podría eso funcionar? – kabuto178

+1

No se puede averiguar cómo publicar el código aquí, pero en palabras: todo debería estar bien con notifyDataSetChanged(). ¿Qué problema tienes exactamente? – Infernus

0

Escribe el siguiente código en MyAsyncTask() Método OnPostExecute()

ArrayList<String> adapterList = new ArrayList<String>(); 
adapterList=myTask.execute(url).get(); 
if(!adapterList.isEmpty()){ 
    ..... 
} 
Cuestiones relacionadas