2011-12-28 50 views
3

我面臨的問題與自動完成在Android中。我沒有在Activity本身中對數據進行硬編碼,而是試圖在每個匹配的按鍵上從其他應用程序動態讀取數據。請在我的程序下面找到並告訴我我錯在哪裏。Android中的自動完成與動態數據無法工作

注意:在第一次按鍵時,結果正在填充。之後,如果我清除輸入的文本並輸入不同的字符,則結果不會顯示在自動完成下拉框中。我從每個按鍵上的其他應用程序獲取,但未在自動完成下拉框中填充。

我試着用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

我想你應該再讀AutocompleteEditText的概念。自動處理過濾過程,爲什麼你要過濾?你能解釋一下嗎? – 2011-12-28 08:04:03

+0

你能幫我解決這個問題嗎?如何進一步進行? – 2011-12-28 10:26:10

回答

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

我試着用上面的提示。但沒有奏效。對此有何幫助? – 2011-12-28 10:24:53

+0

你通過url ........ – 2011-12-28 11:10:02

+0

我已經解決了我的問題,增加了這一行:即adapter.addAll(countries);取得結果後。 – 2012-01-06 02:05:27

3

我不知道是什麼JSON你正在使用解析。但這裏是一個動態自動完成使用維基百科建議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示例。

這裏是example