IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

AutoCompleteTextView & class Async


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut AutoCompleteTextView & class Async
    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):
    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)	{	}
    }
    fonctionnement 100% normal:
    -> à 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):
    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));
    		}
    	}	
    }
    fonctionnement dégradé:
    -> 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?

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    à priori, pas un problème de contexte d'affichage déjà...

  3. #3
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Et si tu force ton adpater a se rafraichir avec un notifyDataSetChanged(), ca donne quoi ?

    J'ai l'impression que tu réutilises le même adpater et qu'il a du mal a se rafraichir essaye de le forcer !

    http://developer.android.com/referen...ayAdapter.html

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Bonne idée oui.
    Mais test fait, et toujours pareil..........

    C'est vraiment un truc de fou!!
    Y a absolument rien de logique là dedans!

  5. #5
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Hmm

    Essaye de rajouter un invalidateViews sur ta ListView après avoir mis à jour ton adpater et notifier son changement.

    http://developer.android.com/referen...alidateViews()


    Si cela ne marche pas essaye de passer par ton propre adapter pour pouvoir le débogguer tranquillement.

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Idem pour le invalidate().

    Par contre, et ça te donnera peut être une idée:

    1.) le nb de caractères
    -> threshold: marche pas, on est d'accord

    -> threshold + 1: marche bien (sauf point 2 ci-dessous)

    -> on supprime un caractère dans la zone de la ville pour revenir à threshold: là ça marche(???), la liste s'affiche correctement.

    2.) rappel: problème que je pense lié à la même "source"
    -> depuis Async, bien que le listenner soit bien défini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ville.setOnItemSelectedListener(this);
    -> on ne passe JAMAIS dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void onItemSelected(AdapterView<?> parent,View v, int position, long id)
    {
    Log.d("********debug");
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  3. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo