2011-12-28 2 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.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); 
     } 
    } 
}; 

그런 다음 필터 사용 : 또한

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

위의 힌트로 시도했습니다. 그러나 일하지 않았다. 이것에 대한 도움이 필요하십니까? –

+0

u가 url을 통과했습니다 ........ –

+0

이 줄을 추가하여 문제를 해결했습니다 : 즉, adapter.addAll (countries); 결과를 가져온 후 –

3

내가 모르는 u는이 링크를 사용할 수 있습니다

private AutoCompleteTextView beverageName; 
    ... 

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

또는 무엇 JSON 여기에 내가이 작업을 수행하는 데 사용하는 몇 가지 코드입니다 당신은 구문 분석에 사용하고 있습니다. 그러나 여기에는 Wikipedia Suggest JSON을 사용한 동적 자동 완료의 예제가 있습니다. JSON Part를 변경하기 만하면됩니다.

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

관련 문제