2011-12-28 6 views
3

アンドロイドでオートコンプリートの問題に直面しています。アクティビティそのもののデータをハードコーディングするのではなく、一致したすべてのキープレスで他のアプリケーションからデータを動的に読み込もうとしました。私のプログラムの下で私が間違っている場所を教えてください。アンドロイドのオートコンプリートがダイナミックデータで動作しない

注:初めてキーを押すと、結果にデータが入力されます。その後、入力したテキストをクリアして別の文字を入力すると、結果は自動完成ドロップダウンボックスに表示されなくなります。私はすべてのキープレスで他のアプリケーションから取得していますが、自動完全なドロップダウンボックスに入力されていません。

私はtextView.showDropDown()で試行しました。およびadapter.setNotifyOnChange(true);オプション。しかし、使用しないでください。

package com.util; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 

public class HelloAutoCompleteActivity extends Activity { 
List countries = new ArrayList(); 
    String url = ""; //some application url 
AutoCompleteTextView textView; 
ArrayAdapter<String> adapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country); 
    textView.addTextChangedListener(new CostomTextWatcher()); 
    textView.setThreshold(1); 
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, countries); 
    textView.setAdapter(adapter); 
} 

private class CostomTextWatcher implements TextWatcher { 

    @Override 
    public void afterTextChanged(Editable s) { 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     if (s.length() > 0) { 
      countries.clear(); 
      String readTwitterFeed = readFeed(s.toString()); 
      System.out.println(readTwitterFeed); 
      try { 
       JSONObject menuObject = new JSONObject(readTwitterFeed); 
       JSONArray menuitemArray = menuObject 
         .getJSONArray("objectNameList"); 
       for (int i = 0; i < menuitemArray.length(); i++) { 
        System.out.println(menuitemArray.get(i)); 
        countries.add(menuitemArray.get(i).toString()); 
       } 
       // adapter.notifyDataSetChanged(); 
       // adapter.setNotifyOnChange(true); 
       // textView.setAdapter(adapter); 
       // textView.setThreshold(1); 
       // textView.setAdapter(adapter); 
       // textView.showDropDown(); 
       // adapter.setNotifyOnChange(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public String readFeed(String val) { 

    StringBuilder builder = new StringBuilder(); 
    HttpClient client = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(
      url); 
    try { 
     HttpResponse response = client.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     int statusCode = statusLine.getStatusCode(); 
     if (statusCode == 200) { 
      System.out.println("200"); 
      HttpEntity entity = response.getEntity(); 
      InputStream content = entity.getContent(); 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(content)); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 
     } else { 
      System.out.println("else block"); 
      Log.e(HelloAutoCompleteActivity.class.toString(), 
        "Failed to download file"); 
     } 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return builder.toString(); 
} 

}

+0

です。ろ過プロセスが自動的に処理され、なぜフィルタリングしようとしていますか?もっと説明できますか? –

+0

これを手伝ってもらえますか?さらに進めるには? –

答えて

4

あなたにもこれを実装するFilterインタフェースを使用することができます。 Filter.performFiltering()は、このタイプの目的のためだけにUIスレッドから呼び出されます。ここで私はこれを行うために使用するいくつかのコードは次のようになります。そして、

Filter filter = new Filter() { 

    @Override 
    public CharSequence convertResultToString(Object resultValue) { 
     return resultValue.toString(); 
    } 

    @Override 
    protected FilterResults performFiltering(CharSequence charSequence) { 
     if(charSequence == null) return null; 
     try { 
      // This call hits the server with the name I'm looking for and parses the JSON returned for the first 25 results 
      PagedResult results = searchByName(charSequence.toString(), 1, 25, true); 
      FilterResults filterResults = new FilterResults(); 
      filterResults.values = results.getResults(); 
      filterResults.count = results.getResults().size(); 
      return filterResults; 
     } catch (JSONException e) { 
      return new FilterResults(); 
     } 
    } 

    @Override 
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 
     if(filterResults != null) { 
      adapter.clear(); 
      adapter.addAll((List<MyObject>)filterResults.values); 
     } 
    } 
}; 

フィルターを使用して:

private AutoCompleteTextView beverageName; 
    ... 

    beverageName = findViewById(R.id.beverageName); 
    ListAdapter adapter = ... 
    adapter.setFilter(filter); 
    beverageName.setAdapter(adapter); 

またはuも

http://www.grobmeier.de/android-autocomplete-with-json-data-served-by-struts-2-05122011.html 
+0

私は上記のヒントを試しました。しかし、動作しませんでした。これに関する助言? –

+0

uはURLを経由しました........ –

+0

私はこの行を追加して問題を解決しました。つまり、adapter.addAll(countries);結果を取得した後 –

3

をこのリンクを使用することができますが、私はどのようなJSONを知りませんあなたは解析するために使用しています。しかし、ここには、Wikipedia Suggest JSONを使った動的自動補完の例があります。 JSONパーツを変更するだけです。

package com.yourapplication.wiki; 

import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 

public class WikiSuggestActivity extends Activity { 
    public String data; 
    public List<String> suggest; 
    public AutoCompleteTextView autoComplete; 
    public ArrayAdapter<String> aAdapter; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     suggest = new ArrayList<String>(); 
     autoComplete = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1); 
     autoComplete.addTextChangedListener(new TextWatcher(){ 

      public void afterTextChanged(Editable editable) { 
       // TODO Auto-generated method stub 

      } 

      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       // TODO Auto-generated method stub 

      } 

      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       String newText = s.toString(); 
       new getJson().execute(newText); 
      } 

     }); 

    } 
    class getJson extends AsyncTask<String,String,String>{ 

    @Override 
    protected String doInBackground(String... key) { 
     String newText = key[0]; 
     newText = newText.trim(); 
     newText = newText.replace(" ", "+"); 
     try{ 
      HttpClient hClient = new DefaultHttpClient(); 
      HttpGet hGet = new HttpGet("http://en.wikipedia.org/w/api.php?action=opensearch&search="+newText+"&limit=8&namespace=0&format=json"); 
      ResponseHandler<String> rHandler = new BasicResponseHandler(); 
      data = hClient.execute(hGet,rHandler); 
      suggest = new ArrayList<String>(); 
      JSONArray jArray = new JSONArray(data); 
      for(int i=0;i<jArray.getJSONArray(1).length();i++){ 
      String SuggestKey = jArray.getJSONArray(1).getString(i); 
      suggest.add(SuggestKey); 
      } 

     }catch(Exception e){ 
      Log.w("Error", e.getMessage()); 
     } 
     runOnUiThread(new Runnable(){ 
      public void run(){ 
       aAdapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.item,suggest); 
       autoComplete.setAdapter(aAdapter); 
       aAdapter.notifyDataSetChanged(); 
      } 
     }); 

     return null; 
    } 

    } 
} 

ご協力ありがとうございます。

0

JSONをソースコードで使用してAndroid AutoCompleteTextViewの例を公開しました。ここ

は、私はあなたが再びAutocompleteEditTextの概念を読むべきだと思うexample

関連する問題