2012-07-18 21 views
5

Bir sunucu ile AsyncTask kullanarak bir otomatik tamamlama yapmaya çalışıyorum. Kodumu burada paylaştım.Otomatik Tamamlama TextView asynctask ve webservice ile android 4

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

Ve AsyncTask kodu

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

} 

Benim sorundur,

  • Ben mümkün ArrayList sonuçlarını günlüğe yapabilirsiniz:

    Bu

    benim AutocompleteTextwatcher kodudur AsyncTask (giriş yaptım ve kontrol ettim). Ancak, değerler otomatik tamamlama açılır menüsünde gösterilmiyor.
  • Buraya sürpriz oldum, yazılan üç karakterden daha fazlası için web sunucusuna otomatik tamamlama isteğini yaptım. 3 karakterden fazla yazıldığında, istek devam ediyor, hiçbir öneri gösterilmiyor. Ancak, istek bir kez gerçekleştikten sonra yazılan 3 karakterden daha azını gösteren öneri.
  • Kodumdan fırlatılan istisnalar yoktur. i is çalıştığım şey

,

  • Ben AsyncTask arasında onPostExecute adaptörü ayarlamak çalıştı. Aynı çıktı gösteriliyor.
  • Android 2.3 emülatörüyle denedim. İyi çalışıyor.

Android 4 ve AsynctaskdoInBackground() ile ilgili herhangi bir sorun var mı?

cevap

8

Bende aynı durum var. Yardım edeceğini bilmiyorum, ancak adaptörünüzü ekledikten sonra bu kod satırlarını eklemenizi tavsiye ederim.

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

Bu bana yardımcı oldu. Doğru olması için, bu davranışın tam nedenini bilmiyorum, ancak AutoCompleteTextView'ın önceki uygulamalarında, açılır listeyi görüntülemek için ListView'ı kullandılar. 4.0'da (ve belki daha önce), ListPopupWindow'u kullanmaya başlarlar. Sebebi bu olabilir. Şerefe

Burada cevaba benzer bir filtre uygulamak gerekir
+0

Aynı vardı Sorun, bağdaştırıcıdan önce bunu ayarladıktan sonra görünür, ancak notifyDataSetChanged(). Bu işe yarar mı? – kabuto178

+1

Burada kodun nasıl yazılacağını anlayamıyorum, ancak kelimelerde - notifyDataSetChanged() ile her şey yolunda olmalıdır. Tam olarak ne problemin var? – Infernus

0

MyAsyncTask (aşağıdaki kodu yazın) OnPostExecute() yöntemi

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