2012-09-10 3 views
4

저는 Android 세계에서 신인이며 2.1 Google API를 기반으로 한 소규모 교육용 SW를 구축했습니다.AutoCompleteTextView 및 Async 클래스

그 당시에는 주 스레드와 작업 스레드에 대해 아직 알지 못했기 때문에 모든 코드를 주 스레드에 넣었습니다.

4.0 Google API에 맞게 내 네트워크 액세스를위한 비동기 클래스로 수정했습니다.

하지만 마지막으로 한 가지만 신경 쓰여서 단서를 찾을 수 없습니다.

그것은 (프랑스어로 "도시") 필드 상의 AutoCompleteTextView에에 관한 것입니다.


(2.1) 전 :

public void onTextChanged(CharSequence s, int start, int before, int count) 
{ 
String result = null; 
InputStream is = null; 
List<String> r = new ArrayList<String>(); 

    if (ville.enoughToFilter()) 
    { 
     is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText()); 
     result = lectureData(is); 

     try 
     {   
      JSONArray jArray = new JSONArray(result); 
      JSONObject json_data=null; 
      for(int i=0;i<jArray.length();i++) 
      { 
        json_data = jArray.getJSONObject(i); 
        r.add(json_data.getString("VILLE")); 
        a_idVil.add(json_data.getString("CLEF_VILLE"));  
      } 
      ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,r)); 
      ville.setOnItemSelectedListener(new villeListener()); 

     } 
     catch(JSONException e1) 
     { 
       Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show(); 
       Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--"); 
     } 
     catch(ParseException e1) 
     { 
       Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show(); 
       Log.d("***** TestActivity/onTextChanged: ParseException *****", "--"+e1.toString()+"--"); 
     } 
    } 
} 
public class villeListener implements OnItemSelectedListener 
{ 
    public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) 
    { 
     villePosition = pos;  
    } 
    public void onNothingSelected(AdapterView<?> arg0) { } 
} 

완벽한 100 % 실행 :

-> 4 caracters 후이 쿼리는 MySQL의 실행을 4 개의 문자로 시작하는 모든 도시를 찾으려면, 오른쪽 하나를 선택하는 선택 목록을 표시 확인을

-> 청취자은 선택된 도시의 인덱스 제공 : OK


AFTER (4.0)

public void onTextChanged(CharSequence s, int start, int before, int count) 
{   
if (ville.enoughToFilter()) 
{   
    new RemplirVille().execute(BASE_URL + "ville.php?ville=" + ville.getText()); 
    Log.d("***********","AVANT"); 
    ville.setOnItemSelectedListener(new villeListener()); 
    Log.d("***********","APRES");   
} 

} 
public class villeListener implements OnItemSelectedListener 
{ 
public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) 
{ 
    villePosition = pos; 
    Log.d("*************9999999", "1111111111"); 
} 
public void onNothingSelected(AdapterView<?> arg0) { } 
} 

class RemplirVille extends AsyncTask<String, String, List<String>> 
{ 
Integer errorMsgId; 
String errorMsgParam; 

protected List<String> doInBackground(String... param) 
{ 
    List<String> listeAffichageVille = new ArrayList<String>(); 
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

    try 
    { 
      HttpClient httpclient = new DefaultHttpClient();  
      HttpPost httppost = new HttpPost(param[0]); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost);  
      if (response.getStatusLine().getStatusCode() < 400) 
      { 
        HttpEntity entity = response.getEntity(); 
        String entityStr = EntityUtils.toString(entity); 
        JSONArray json_array = new JSONArray(entityStr); 

        for(int i=0;i<json_array.length();i++) 
        { 
         JSONObject json_ligne = json_array.getJSONObject(i);        
         listeAffichageVille.add(json_ligne.getString("VILLE")); 
         a_idVil.add(json_ligne.getString("CLEF_VILLE")); 
        } 
      } 
      else 
      { 
       Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION http error *****", "--"+response.getStatusLine().toString()+"--"); 
       this.errorMsgId = R.string.http_site_error; 
       listeAffichageVille = null; 
      } 
    } 
    catch (Exception ex) 
    { 
      Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION decode error *****", "--"+ex.toString()+"--"); 
      this.errorMsgId = R.string.http_decode_error; 
      this.errorMsgParam = ex.getLocalizedMessage(); 
      listeAffichageVille = null; 
    } 
    return listeAffichageVille; 
} 

protected void onProgressUpdate(String... item) { } 
protected void onPreExecute(List<String> list) { } 
protected void onPostExecute(List<String> list)  
{    
    if (list == null) 
    { 
      if (this.errorMsgId != null) 
      { 
       String msg = TestActivity.this.getString(this.errorMsgId); 
       Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show(); 
      }  
    } 
    else    
    { 
     ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list)); 
    } 
} 
} 

다음과 같은 문제가 발생합니다.

-> 당신은 도시의 목록으로 모니터하기 (enoughToFilter + 1) caractères을 넣어해야합니다 :

BAD ->도 더 이상 실행되지 않습니다 청취자 : BAD


사실을 enoughToFilter이 잘 작동하면 목록을 표시하지 않는다는 점을 제외하면 ok가 실행되는 RemplirVille 클래스가 실행됩니다! 당신이 1 개 caracter에 넣어 경우

하지만, : -> enoughToFilter 여전히 잘 일 - > RemplirVille는 데이터를 한 번 더 제공합니다 ....하지만 이번에는 선택 목록이 잘 표시됩니다.

그 주제에 대한 아이디어가 있으십니까? 컨텍스트 문제라고 생각하지만 GetApplicationCOntext를 사용하더라도 문제가 발생할 수 있습니다.

감사합니다.

+0

나는 여기에 비슷한 것을하고있다 !!! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42

답변

2

AutoCompleteTextView.setAdapter()을 호출해도 드롭 다운이 자동으로 표시되지 않지만 드롭 다운을 AutoCompleteTextView.showDropDown()과 같이 표시 할 수 있습니다.

protected void onPostExecute(List<String> list){ 
    //... 
    ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list)); 
    if(ville.isInputMethodTarget()){ 
     ville.showDropDown(); 
    } 
    //... 
} 

이 항목이 없으면 다음 문자가 입력 될 때까지 드롭 다운이 표시되지 않아서 (sufficientToFilter + 1) 문제가 발생했습니다.

관련 문제