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 :

Problème de chargement d'une listView dans un thread


Sujet :

Composants graphiques Android

  1. #1
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut Problème de chargement d'une listView dans un thread
    Bonjour à tous,

    Dans le cadre de mon initiation à Android, je cherche a remplir une ListView dans un Thread.

    Voici un bout de mon code très basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    final ArrayAdapter<String> a = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1);
    ListView vi = (ListView)getActivity().findViewById(R.id.domainListView);
    vi.setAdapter(a);
    new Thread( new Runnable() {    
    @Override
                    public void run() {  
                        for(int i=0; i<10; i++) {
                            a.add("toto");
                        }
                    }
      }).start();
    Or ceci ne semble pas etre vraiment autorisé, j'obtiens l'exception suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    only the original thread that created a view hierarchy can touch its views
    Existe t'il une alternative pour mettre à jour ma list view dans un Thread ?

    Merci d'avance,
    Jerem
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  2. #2
    Membre émérite
    Avatar de nbenbourahla
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 41
    Points : 2 348
    Points
    2 348
    Par défaut
    Bonjour,

    Ce bout de code devrait marcher

    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
     
    	new Thread( new Runnable() {    
    	@Override
             public void run() {  
    		for(int i=0; i<10; i++) {
    		    runOnUiThread(new Runnable() {
    				@Override
    				public void run() {
    					a.add("toto");
    					a.notifyDataSetChanged();
    				}
    		});
    	 }
    	 }
     }).start();
    Effectivement pour pouvoir modifier ton adapter, il faut que tu soit dans l'UI Thread, du coup tu peux utiliser la méthode runOnUiThread pour effectuer la modification de ton adapter.

    Tu peux aussi utiliser la méthode, notifyDataSetChanged pour signaler que ton adapter a changé (contient des valeurs en plus ou en moins).

    Voila, en espérant que ça règle ton problème
    --
    Développeur Android
    nazim.benbourahla.com

  3. #3
    Expert éminent

    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
    Points : 9 149
    Points
    9 149
    Par défaut
    Euh pour l'exemple, pas besoin d'imbriquer les deux runnable tu peux le faire qu'avec le RunOnUIThread

    Tu peux aussi utiliser la méthode, notifyDataSetChanged pour signaler que ton adapter a changé (contient des valeurs en plus ou en moins).
    Le add de l'ArrayAdapter peut le faire automatiquement

    public void setNotifyOnChange (boolean notifyOnChange)

    Since: API Level 1
    Control whether methods that change the list (add(T), insert(T, int), remove(T), clear()) automatically call notifyDataSetChanged(). If set to false, caller must manually call notifyDataSetChanged() to have the changes reflected in the attached view. The default is true, and calling notifyDataSetChanged() resets the flag to true.
    Parameters

    notifyOnChange if true, modifications to the list will automatically call notifyDataSetChanged()
    Effectivement pour pouvoir modifier ton adapter, il faut que tu soit dans l'UI Thread, du coup tu peux utiliser la méthode runOnUiThread pour effectuer la modification de ton adapter.
    +1
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  4. #4
    Membre émérite
    Avatar de nbenbourahla
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 41
    Points : 2 348
    Points
    2 348
    Par défaut
    Merci pour l'indication Feanorin je savais pas
    --
    Développeur Android
    nazim.benbourahla.com

Discussions similaires

  1. Problème chargement d'une image dans canvas
    Par Hujii dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 28/04/2008, 21h33
  2. Réponses: 8
    Dernier message: 12/05/2006, 14h04
  3. Réponses: 7
    Dernier message: 12/03/2006, 21h18
  4. problème de chargement d'une Applet
    Par cladsam dans le forum Applets
    Réponses: 1
    Dernier message: 31/01/2006, 23h04
  5. [VBA] Problème récup texte d'une cellule dans un tableau
    Par Marco le Pouillot dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 30/01/2006, 17h06

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