2012-07-18 4 views
5

サーバでAsyncTaskを使ってオートコンプリートをしようとしています。ここで私のコードを共有しました。androidでasynctaskとwebserviceを使ったAutocomplete TextView 4

これは私の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()); 
      } 
     } 
    } 
}); 

そして、私の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(); 
    } 

} 

私の問題は、私はArrayListの結果を記録することができ、

  • で、ありますAsyncTask(私はログに記録され、チェックされています)。しかし、値はオートコンプリートドロップダウンに表示されません。
  • 私はここに驚いています、私は3文字以上のタイプのWebサーバーに自動完了要求を出しました。一度3文字以上入力すると、リクエストは進行中ですが、提案は表示されません。しかし、リクエストの後に3文字未満で表示される提案は、一度起こった。
  • 私のコードから例外はありません。私が試した何

  • 私はAsyncTaskonPostExecuteにアダプタを設定しようとしました。同じ出力が表示されています。
  • 私はアンドロイド2.3エミュレータで試しました。それは正常に動作します。

android 4とAsynctaskdoInBackground()に問題がありますか?

答えて

8

私は同じ状況にあります。私は助けになるかどうかはわかりませんが、アダプターを追加した後にこれらのコード行を追加することをお勧めします。

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

私を助けました。実際には、私はこの動作の正確な理由はわかりませんが、以前のAutoCompleteTextViewの実装では、ListViewを使用してドロップダウンを表示していました。 4.0では、ListPopupWindowの使用を開始します。これが理由かもしれない。 乾杯

+0

に以下のコードを書く私は同じでしたアダプタの前にこれを設定した後に表示されますが、notifyDataSetChanged()はどうでしょうか。それは働くことができますか? – kabuto178

+1

ここにコードを投稿する方法は分かりませんが、言葉ではすべてがnotifyDataSetChanged()でOKです。どのような問題がありますか? – Infernus

0

はMyAsyncTask()OnPostExecute()メソッド

ArrayList<String> adapterList = new ArrayList<String>(); 
adapterList=myTask.execute(url).get(); 
if(!adapterList.isEmpty()){ 
    ..... 
} 
関連する問題