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

Composants graphiques Android Discussion :

Spinner & initialisation de la liste [Débutant(e)]


Sujet :

Composants graphiques Android

  1. #21
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    ListActivity est une Activity implémente OnListItemClick (ou un truc du genre) et permet d'appeler directement "setListAdapter" (que tu n'utilises plus cf premier message). Pour cela elle part du principe qu'il y a une ListView dans le layout, et que cette ListView a pour identifiant "@android:id/list"...

    Si tu regardes le source de ListActivity, tu verras qu'il n'y a pas beaucoup de code... Utiliser cette classe n'a de sens que si ton activité *est* une liste à priori.... sinon aucun interêt...

    Toi tu utilise deux spinners, donc pas de lien avec ListActivity, donc hérite directement de Activity.
    A priori si tu n'appelles pas setListAdapter() il n'y a rien à changer !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Tiens, mon message précédent (de remerciement) a disparu(??)...

    Bref, autre question super rapide toi je suppose, critères de recherche gogole trop génériques pour ne pas générer 625M de pages!
    -> rappel du MSG "disparu" donc: ok c'est bon j'y suis arrivé suite à tes indications

    -> maintenant je voudrais juste savoir s'il est possible de masquer une partie des données chargée dans le spinner pour ne pas afficher une colonne de ma BDD présente dans ma requête et dont j'ai besoin?

    pour schématiser:
    -> spinner chargé avec data table A
    -> data utiles + clé de la table B
    -> et bien sûr la clé B n'a aucune raison d'apparaitre dans le spipnner!

    Voilà, donc je ne sais pas si c'est possible.

    L'autre alternative sera de remplir en // au spinner un tableau avec juste la clé B et de la récupérer ensuite avec l'indice du spinner sélectionné......

  3. #23
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    résultat des course: ça marche très bien avec un ArrayList<String> rempli en // du spinner!

    maintenant, est ce que dans la démarche c'est correct?

    sinon, question complémentaire:
    -> dans mon activity principale j'ai donc 2 spinner.....
    -> pour 1 seule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void onItemSelected(AdapterView<?> parent,View v, int position, long id)
    fonction étant donc exécutée en sortie des 2 spinner.... génant!

    donc:
    -> quel test faire dans cette procédure pour savoir si l'on vient de spinner1 ou de spinner2?

    merciiiiiiiiiii

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    signe des mes progrès?

    en tout cas j'ai trouvé la réponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    spinner1.setOnItemSelectedListener(new spinner1Listener());
    spinner2.setOnItemSelectedListener(new spinner2Listener());

  5. #25
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    ou simplement comme tu recois le spinner en parameter (AdapterView):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    switch (parent.getId()) {
      case R.id.spinner1:
         => spinner 1
      case R.id.spinner2:
         => spinner 2
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    alors ça CT bien ma 1ère idée mais je m'attendais à trouver des noms en "clair": spinner1 & spinner2!

    pas pensé à faire le lien avec R...

    la seule question maintenant:
    -> est ce que les 2 se valent?
    -> ta version est + performante?

  7. #27
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    La première solution (la tienne) consiste à créer deux classes (généralement unnamed) et est "orientée-objets":
    Code java : 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
     
    class MyActivity extends Activity
    {
     
        public void onCreate(...)
        {
             ...
     
             spinner1.setOnItemSelected(new OnItemSelectedListener() {
                  public voic onItemSelected(AdapterView<?> parent,View v, int position, long id)
                  {
                        MyActivity.this.onSpinner1ItemSelected(parent,v,position,id);
                  }
               });
     
             spinner2.setOnItemSelected(new OnItemSelectedListener() {
                  public voic onItemSelected(AdapterView<?> parent,View v, int position, long id)
                  {
                        MyActivity.this.onSpinner2ItemSelected(parent,v,position,id);
                  }
               });
        }
     
     
        public void onSpinner1ItemSelected(AdapterView<?> parent,View v, int position, long id)
        {
               [SPINNER 1 SELECT CODE]
               onSpinnerSelectionChange();
        }
     
     
        public void onSpinner2ItemSelected(AdapterView<?> parent,View v, int position, long id)
        {
               [SPINNER 2 SELECT CODE]
               onSpinnerSelectionChange();
        }
     
     
        public void onSpinnerSelectionChange()
        {
               [SPINNER SELECT COMMON CODE]
        }
    }

    La seconde solution est à mon avis plus lisible (bien que plus compliquée à débugger je pense)
    Code java : 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
     
    class MyActivity extends Activity implements OnItemSelectedListener
    {
     
        public void onCreate(...)
        {
             ...
     
             spinner1.setOnItemSelected(this);
             spinner2.setOnItemSelected(this);
        }
     
     
        public void onItemSelected(AdapterView<?> parent,View v, int position, long id)
        {
               if (parent.getId() == R.id.spinner1) {
                     [SPINNER 1 SELECT CODE]
               } else if (parent.getId() == R.id.spinner2) {
                     [SPINNER 2 SELECT CODE]
               }
               [SELECT COMMON CODE]
        }
     
     
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #28
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    ok, mais au niveau performance pure?
    une différence notable?

  9. #29
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ca va se jouer a des pouillemes de ms....
    Sur une action utilisateur ce ne sera certainement notable ni pour l'utilisateur (en dessous de 20ms on ne voit rien), ni pour le système...
    Le code le plus clair doit être préféré.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #30
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    ok, merci.

  11. #31
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    le retour de la vengeance de la mort:

    comme tu peux voir ici, j'ai implémenté un AutoCompleteTextView, avec la recherche en BdD qui va bien!



    ça fonctionne bien SAUF QUE, comme on le voit, cet espèce de ******* affiche en blanc sur fond... blanc!!!!
    -> donc seule la sélection est visible(?)

    j'ai bien sûr essayé de jouer avec les paramètre TextColor, BackgroundColor & Cie mais ça ne joue QUE sur le champ de saisi (contenant Mulh ici) ET NON sur la liste déroulante....................

    donc quels sont les paramètres permettant d'atteindre la liste elle-même?

    merci.
    @+

  12. #32
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Tout vient du layout selectionné comme layout de drop down item....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  13. #33
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    j'en ai essayé une bonne moitié oui, vu que les noms ne sont pas super parlant!
    et à part le mien, tous les autres sont texte noir sur fond blanc.

  14. #34
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    le retour de la vengeance de la mort 2: le fils du fantôme

    en fait, là ça concerne les thread, mais je continue de dérouler le fil ici.

    j'ai cette fct (de ma classe principale) qui s'occupe de lancer une requête http
    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
     
    /************************************************************************/
    /* connexionHttp: établissement de la connexion HTTP à partir d'une URL */
    /************************************************************************/
    /* IN : URL à connecter                                                */
    /* OUT : InputStream obtenue                                 	        */
    /************************************************************************/
    public InputStream connexionHttp (String URL)
    {
        	ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        	InputStream is = null;
     
        	//établissement de la connexion http
        	try
        	{	     		
    	    	HttpClient httpclient = new DefaultHttpClient();	   
    	    	HttpPost httppost = new HttpPost(URL);
    	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    	        HttpResponse response = httpclient.execute(httppost);	   
    	        HttpEntity entity = response.getEntity();	   
    	        is = entity.getContent();
        	}
        	catch(Exception e)
        	{	              
        		Toast.makeText(getBaseContext(),e.toString() ,Toast.LENGTH_LONG).show();
            }
    return is;
    }
    problème: depuis la version 3.0, les accès au web (entre autres) doivent sortir du thread principal, sous peine de planter l'appli avec 1 NetworkOnMainThreadException!

    je me suis donc renseigné sur les thread et j'ai testé plusieurs solutions, hélas sans succès puisque la fct recoit 1 param et en retourne aussi 1!

    j'ai essayé, entre autre, d'encapsuler le corps de ma fct dans un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public InputStream connexionHttp (String URL)
    {
    Thread thread = new Thread(new Runnable() 
    {
    	public void run() 
    	{  
                 ...................
            }
    });
    thread.start();
    }
    mais je n'arrive pas à récupérer l'InputStream génénré dans le thread..........

    en manque d'inspiration, et d'expertise, je me tourne à nouveau vers le forum...

    que faut-il modifier à ce code pour que la fct soit lancée dans un thread séparé, tout en pouvant renvoyer ma variable is?

  15. #35
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je ne comprends pas la logique....

    L’intérêt du NOME, est de forcer les programmeurs à faire ce qui est recommandé depuis le début du début des portable-device: ne pas faire d'opération longues dans le thread principal de l'appli (celui de l'UI)...

    La tu veux récupérer un InputStream par un thread... ok... pourquoi pas, tout est faisable:
    (attention pseudo-code)
    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
     
    class MyConnexion implements Runnable
    {
         InputStream stream;
     
         public MyConnexion (parameters)
         {
         }
     
         public void run()
         {
             stream = ...;
             MyActivity.this.onConnexionReceived(this);
         }
    }
     
     
    public void onConnexionReceived(MyConnexion conn)
    {
         InputStream is = conn.stream;
    }
     
     
     
    Quelque part dans l'activité:
    Thread t = new Thread(new MyConnexion(params));
    t.start();
    Mais tu comptes en faire quoi de ce Stream ? A priori le lire... donc... encore de l'accès réseau (parce que toutes les données n'ont peut être pas encore été reçu alors que la réponse HTTP a déjà été validée).... En plus il te faut un moyen de synchronisation pour dire à l'UI "c'est bon j'ai le stream !"

    En prime, il faut éviter au maximum de partager des ressources telles que des streams (pour des raisons évidentes de synchronisation) entre plusieurs threads.... imagine que les threads lisent à tour de role dans le stream, aucun thread ne sait la position exacte dans le stream ! ^^

    Donc je pense qu'il faut revoir l'architecture générale...
    Quand on programme pour un device portable, il faut que l'UI parte du principe que tout est accessible immédiatement... au pire des données par défaut.
    Ensuite, si il y a besoin de récupérer ces données "ailleurs" (accès lent), alors une tâche de mise à jour est démarrée quand elle finie, la tâche dit à l'UI "hey ! j'ai des nouvelles données pour toi !".

    Donc grosso modo on a coté UI:
    - updateUIData(data)
    - initUI (qui fait appel à updateUIData(data) avec des data locales)
    Et dans un "thread":
    - grabData(...)
    - appel de updateUIData(data) avec des data 'nouvelles', mais dans le thread UI (c'est la ou ce n'est pas trivial).


    Il y a plein de moyen de réaliser cela, plus ou moins compliquées, la plus simple est l'utilisation de "AsyncTask" qui permet de gérer au moins 3 partie:
    * La gestion des threads (l'AsyncTask n'est pas un thread, mais sera executé par un worker-thread)
    * La gestion du "cancel" (ben oui, si l'utilisation quitte l'application avant que la tache ne soit finie)
    * La gestion de la progression (avec mise à jour de l'interface dans le "bon thread").

    La tâche se chargera: d'ouvrir la connexion, de demander les données, de décoder ces données dans le format local à l'UI... et surtout... de fermer la connexion

    J'avais proposé une classe dans la section Contribuez pour récupérer du JSON (mais ca pourrait être autre chose hein !) avec les AsyncTask... mais je ne sais pas si tu y as accès:
    http://www.developpez.net/forums/d12...lire-json-url/
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  16. #36
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Tu m'avais déjà donné tes classes oui, mais pour le moment c'est du chinois pour moi encore ...... d'où "ma" solution... en attendant...

    Donc, sans trahir aucun secret d'une appli sensible, pourrais-tu poster un bout de code (classe + utilisation) avec la séquence (init, lecture, traitement, etc..)?

    Un vrai cas réel quoi?

  17. #37
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    En cherchant la documentation AsyncTask tu devrais trouver tout ce que tu veux...

    Mais en gros (à adapter bien sur !):
    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
     
    class MyActivity extends Activity
    {
        ArrayAdapter<String> dataAdapter;
     
        @Override
        public void onCreate(Bundle savedState)
        {
            super.onCreate(savedState);
            setContentView(...);
     
            this.dataAdapter = new ArrayAdapter<String>();
            findViewById(R.id.spinner).setAdapter(this.dataAdapter);
     
            new DataDownloadTask().execute();
        }
     
        public void onDataDownloaded(String[] data)
        {
            this.dataAdapter.clear();
            for (String s : data) this.dataAdapter.add(s);
            this.dataAdapter.notifyDataChanged();
        }
        public void onDataDownloadFailed(Throwable t)
        {
            Toast.makeToast(...).show();
        }
     
        class DataDownloadTask extends AsyncTask<Void,Void,String[]>
        {
              Throwable error;
              public String[] doInBackground(Void ... params)
              {
                  String[] ret = null;
                  try {
     
                       ... Ici on met tout le code de récupération des données ...
                       ret = .... 
                  } catch (Throwable t) {
                      this.error = t;
                      ret = null;
                  }
                  return ret;
              }
     
              public void onPostExecute(String[] result)
              {
                   if (result == null)
                      MyActivity.this.onDataDownloadFailed(this.error);
                  else
                      MyActivity.this.onDataDownloaded(result);
              }
           }
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  18. #38
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Je viens de t'envoyer un MP...

  19. #39
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    aurais-je trouvé?

    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
     
    public class TestActivity extends Activity implements AdapterView.OnItemSelectedListener, TextWatcher, LocationListener, JSONObjectTask.OnJSONObjectResult 
    {
    	//constantes globales
    	public static final int TYPE_DEPARTEMENT = 1;
    	public static final int TYPE_REGION = 2;
    	public static final String BASE_URL = "192.168.1.10/";
     
     
    	private boolean spinner1First = true, spinner2First = true;
     
    	private ArrayList<String> a_idDep = new ArrayList<String>();
    	private ArrayList<String> a_idReg = new ArrayList<String>();	
     
     
        public void onCreate(Bundle savedInstanceState) 
        {
        	//init
        	ArrayAdapter<String> spinnerAdapter;
        	super.onCreate(savedInstanceState);
     
    	//création de l'activité
    	setContentView(R.layout.main);
     
    	//récup des ID des composants
    	Spinner spinner1 =(Spinner)findViewById(R.id.spinner1);
     
           //remplissage des spinner
    	try {
    			spinnerAdapter= new RemplirSpinner().execute(BASE_URL + "dep-nombre.php").get();
    			spinner1.setAdapter(spinnerAdapter);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ExecutionException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	    //définition des écouteurs spinner: 
    	    spinner1.setOnItemSelectedListener(new spinner1Listener());
        }
     
        //CLASSE ASYNC
        class RemplirSpinner extends AsyncTask<String, String, ArrayAdapter<String>>
        {
        	ArrayAdapter<String> aaD;
     
        	protected ArrayAdapter<String> doInBackground(String... URL)
    		{
    	    	String result = null;
    	    	InputStream is = null;
    	    	List<String> listeAffichageSpinner = new ArrayList<String>();
     
    	    	is = connexionHttp(URL[0]);
    	    	result = lectureData(is);
     
    	        try
    	        {        	
    	        	listeAffichageSpinner.add("- Choisir -"); a_idDep.add("?");
     
    	        	JSONArray json_array = new JSONArray(result);
    	          	JSONObject json_ligne=null;					
    	           	for(int i=0;i<json_array.length();i++)
    	           	{
    	           	json_ligne = json_array.getJSONObject(i);
    	                listeAffichageSpinner.add(json_ligne.getString("CLEF_DEP") + " - " + json_ligne.getString("NOM") + " (" + json_ligne.getString("nb") + ")");
    		        a_idDep.add(json_ligne.getString("CLEF_DEP"));
    		        }
    	           	aaD = new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_spinner_item, listeAffichageSpinner);
    	       		return(aaD);
    	        }
    	        catch(JSONException e1)
    	        {
    	            	Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
    	        } 
    	        catch(ParseException e1) 
    	        {
    	            	Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
    	      	}
     
    			return(null);
         }
    }
    sans tes classes JSON pour le moment, ok.

  20. #40
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Salut ! Non je ne répond pas aux MPs sauf cas particuliers (voir charte).

    Tu y es presque

    Il manque la notion du onPostExecute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Thread UI                                              Worker Thread
     
    * Creation AsyncTask
    * Appel de execute()
    * Retour
       - appl de AsyncTask.onPreExecute()
                                                               Démarrage de doInBackground()
                                                                 ...
                                                               Fin de doInBackground()
       - appel de AsyncTask.onPostExecute()
    Tout ce qui est relatif à l'UI doit être dans onPreExecute() ou onPostExecute()... ce qui inclut les Views bien sur, mais aussi les Adapter (ils prennent un context en parametre), et les Toast !

    Tout ce qui est relatif au traitement long doit être dans le doInBackground()

    D'autre part, je ne sais pas ce que tu fais avec le InputStream, mais il semble que tu le transforme en JSON... Donc je ne comprends pas l'interêt de conserver le stream (qui n'est jamais fermé au passage => resource leak) D'autant qu'il y a une fonction qui transforme une entity en string direct !

    Donc voici l'AsyncTask corrigée finale:
    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
     
    //CLASSE ASYNC
    class RemplirSpinners extends AsyncTask<String, String, List<String>>
    {
        	Spinner spinner;
     
            Integer errorMsgId;
            String   errorMsgParam;
     
        	protected List<String> doInBackground(String... URL)
            {
    	    	InputStream is = null;
    	    	List<String> result = new ArrayList<String>();
     
    	    	try {
                         HttpClient httpclient = new DefaultHttpClient();	   
                         HttpPost httppost = new HttpPost(URL);
                         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);
                                  result.add( json_ligne.getString("CLEF_DEP") + " - " + json_ligne.getString("NOM") + " (" + json_ligne.getString("nb") + ")");
                                  a_idDep.add(json_ligne.getString("CLEF_DEP"));
    		           }
     	             } else {
                             // je ne sais plus si StatusLine implémente toString()... à vérifier !
                             Log.e("TestActivity","HTTP Error: "+response.getStatusLine().toString());
                             this.errorMsgId = R.string.http_site_error;
                             result = null;
                         }
    	        } catch (Exception ex) {
                        Log.e("TestActivity","Decode Error",ex);
                        this.errorMsgId = R.string.http_decode_error;
                        this.errorMsgParam = ex.getLocalizedMessage();
                        result = null;
                    }
     
                    return result;
             }
     
             public void onPostExecute(List<String> values)
             {
                   if (values == null) {
                       if (this.errorMsgId != null) {
                           String msg = TestActivity.this.getString(this.errorMsgId);
                           // passer errorMsgParam si besoing avec un format
                           Toast.makeText( TestActivity.this,msg,Toast.LENGTH_LONG).show();
                       }
    	        } else {
                       ArrayAdapter<String> adapter = new ArrayAdapter<String>(values);
                       this.spinner.setAdapter(adapter);
                   }
             }
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. initialisation d'une liste
    Par reda24 dans le forum Général Python
    Réponses: 2
    Dernier message: 21/12/2010, 11h48
  2. Réponses: 13
    Dernier message: 06/02/2010, 16h53
  3. [AC-2003] Initialisation d'une liste déroulante à l'aide du SQL
    Par lil404 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 10/04/2009, 09h47
  4. Initialisation d'une liste avec une classe
    Par Poischack dans le forum Général Python
    Réponses: 2
    Dernier message: 26/12/2007, 23h52
  5. [STL] Initialisation d'une list
    Par franc82 dans le forum SL & STL
    Réponses: 2
    Dernier message: 23/07/2007, 08h20

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