Hello!
Je débute sous Android et je me suis fait une petite appli basé sur les Google API 2.1.
A ce moment là je ne savais pas encore qu'il fallait séparer les accès réseaux de l'UI.
Depuis j'ai corrigé le tir avec des classes Async et Google API 4.0.
Mais je bute sur un problème que je n'arrive pas à résoudre!
-> 1 AutoCompleteTextView sur mon champs ville
AVANT (api 2.1):
fonctionnement 100% normal:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 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()) //REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)! { //établissement de la connexion http is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText()); //récup des data brutes ~> string result = lectureData(is); //décodage JSON de l'input stream try { //remplissage DATA 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) { } }
-> à partir du 4ème caractère saisi, une rqt est lancée en base pour trouver toutes les villes débutant par ces 4 caractères + affichage en liste, avec sélection de la bonne ville
-> le listener affecte bien l'indice de la ville choisie dans la liste
APRES (api 4.0):
fonctionnement dégradé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 public void onTextChanged(CharSequence s, int start, int before, int count) { if (ville.enoughToFilter()) //REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)! { 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) //si NULL alors problème... { if (this.errorMsgId != null) { String msg = TestActivity.this.getString(this.errorMsgId); Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show(); } } else //.. SINON affecter les data à l'adapter! { ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list)); } } }
-> il faut saisir enoughToFilter + 1 caractères pour afficher la liste des villes débutant par ces 4+1 caractères(?)
-> on ne passe plus dans le listener(?)
J'ai déjà reprise le déroulement du code un bon paquet de fois, mais je ne vois pas!
Et comme à force je connais trop bien mon source, de toute façon je ne lis plus vraiment, je survole!
En fait enoughToFilter fonctionne bien, il déclenche bien l'exécution de la classe RemplirVille, qui fait bien son taff aussi (rqt, data ok) sauf que l'affichage de la liste des villes ne se fait pas!
Du coup, comme la liste ne s'affiche pas, on saisi 1 car de plus:
-> enoughToFilter toujours ok puisqu'on est à min+1
-> RemplirVille refait la rqt, ramène encore une fois les data.... et cette fois-ci, oh miracle, affiche bien la liste de choix.
Une idée sur la question?
Partager