2012-07-18 5 views
5

Sto tentando di eseguire un completamento automatico utilizzando AsyncTask con un server. Ho condiviso il mio codice qui.Completamento automatico di TextView con Asynctask e webservice in Android 4

Questo è il codice per la mia 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()); 
      } 
     } 
    } 
}); 

E il mio codice AsyncTask è,

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(); 
    } 

} 

Il mio problema è,

  • posso in grado di accedere risultati di ArrayList da AsyncTask (ho registrato e controllato). Ma i valori non vengono visualizzati nel menu a discesa di completamento automatico.
  • Sono sorpreso qui, ho fatto la richiesta di completamento automatico al server web per più di tre caratteri digitato. Una volta digitati più di 3 caratteri, la richiesta è in corso, non viene mostrato alcun suggerimento. Ma il suggerimento mostrato per meno di 3 caratteri digitato dopo la richiesta è successo una volta.
  • Non ci sono eccezioni generate dal mio codice.

quello che ho provato a dire,

  • Ho cercato di impostare l'adattatore in onPostExecute di AsyncTask. Lo stesso output sta mostrando.
  • Ho provato con l'emulatore Android 2.3. Funziona bene.

C'è qualche problema con Android 4 e AsynctaskdoInBackground()?

risposta

8

Ho la stessa situazione. Non so che sarà d'aiuto, ma ti consiglio di aggiungere queste righe di codice dopo aver aggiunto l'adattatore.

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

Mi ha aiutato. Per essere vero non conosco la ragione esatta di questo comportamento, ma nelle precedenti implementazioni di AutoCompleteTextView hanno usato ListView per visualizzare il menu a discesa. In 4.0 (e forse prima) iniziano a usare ListPopupWindow. Potrebbe essere questa la ragione. Acclamazioni

+0

Ho avuto lo stesso problema, viene visualizzato dopo averlo impostato prima dell'adattatore, ma per quanto riguarda notifyDataSetChanged(). Potrebbe funzionare? – kabuto178

+1

Non riesco a capire come postare il codice qui, ma a parole - tutto dovrebbe essere ok con notifyDataSetChanged(). Che problema hai esattamente? – Infernus

0

Scrivere il seguente codice nel MyAsyncTask() metodo OnPostExecute()

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