저는 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를 사용하더라도 문제가 발생할 수 있습니다.
감사합니다.
나는 여기에 비슷한 것을하고있다 !!! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42