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 :

Manipulation d'une arraylist est persistance d'une varaiable.


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut Manipulation d'une arraylist est persistance d'une varaiable.
    Bonjour,

    Je continue sur mes tribulations de récupération de path:

    Ce coup ci avant de quitter l'activité je voudrais pouvoir remplir une arraylist avec une succession de path correspondant à des fichiers sélectionnés à partir d'une listview.

    Voici ce que j'ai codé (extrait) :
    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
    mList.setOnItemClickListener(new OnItemClickListener() {
     
     
            		public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
            		    final File fichier = mAdapter.getItem(position);
                                //comment faire en sorte de déclarer cette variable et qu'elle ne soit pas remise à 0 ?
            		    final ArrayList<String> fichierListe = new ArrayList<String>(); 
     
            		    // Si c'est un fichier...
            		    if (fichier.isDirectory()){
            		    	 updateDirectory(fichier);
     
            		    }
     
            		    if (fichier.isFile()) {
     
    						fichierListe.add(fichier.toString() );
     
    						selection=(Button)findViewById(R.id.selection);
    						selection.setOnClickListener(new OnClickListener () {
     
    							@Override
    							public void onClick(View arg0) {
     
    								Intent intent = new Intent ();
    								intent.putStringArrayListExtra("list", fichierListe);
    		        		    	setResult (RESULT_OK, intent);
    		        		    	finish ();	
    							}
     
    						});	
            		    } 
     
    				}
     
     
    			});
    En fait je voudrais que mon arraylist se "remplisse" tant que que je sélectionne un fichier dans la listview. Puis un bouton sélection permettra d'exporter la variable arraylist vers une autre activité.

    Ce que je n'arrive pas à réaliser : faire en sorte que ma variable ne soit pas réinitialisée est vidée à chaque fois.

    J'ai encore un soucis avec la conception d'objet et de persistance de la valeur d'une variable .

    Merci par avance pour vos indications.

  2. #2
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Il suffit de mettre ton tableau en variable global de ta classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class MyClass
    {
            private ArrayList<String> fichierListe = new ArrayList<String>(); 
    }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Merci,

    ça marche...pourtant c'est ce que j'avais fait au début...mais j'ai du me faire piéger par la lecture des variables en mode debug..je devais lire la variable fichier et non fichierListe... (qui d'ailleurs n’apparaît dans la console variable d'eclipse)

    Prochaine étape..remplir un fichier .txt avec ma Arraylist...ça promet!

  4. #4
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Oh mais je suis trop généreux aujourd'hui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    File file = new File (MY_FILE_PATH);
    if (file.exists ())
    {
    	file.delete ();
    	file.createNewFile ();
    }
    FileWriter fstream = new FileWriter (file);
    BufferedWriter out = new BufferedWriter (fstream);
    for (String s : fichierListe)
    	out.write (s + "\n");
     
    out.close ();
    fstream.close ();

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Merci David55!!!

    Alors j'étais arrivé au même résultat en passant par une exception:
    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
     
            		private final ArrayList<String> fichierListe = new ArrayList<String>();
    				public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
            		    final File fichier = mAdapter.getItem(position);
            		    // Si c'est un répertoire...
            		    if (fichier.isDirectory()){
            		    	 updateDirectory(fichier);      		    	
            		    }
            		    //si c'est un fichier, j'ajoute le fichier à L'Arraylist fichierListe
            		    //tant que selection n'est pas clické
            		    if (fichier.isFile()) {
    						fichierListe.add(fichier.toString() );
    					     //si je click sur selection
    						selection=(Button)findViewById(R.id.selection);
    						selection.setOnClickListener(new OnClickListener () {                 
    							@Override
    							public void onClick(View view) {
    								//j'écris le contenu de l'ArrayList fichierListe dans un fichier.txt
    								PrintWriter writer = null;
    								try{
    									writer = new PrintWriter(new BufferedWriter(new FileWriter("/storage/sdcard0/fichier.txt")));
    									for (String str : fichierListe)
    									{
    										writer.println(str);										
    									}									
    								} catch (IOException ioe) {
    									ioe.printStackTrace();
    								} catch (Exception e) {
    									e.printStackTrace();
    								} finally {
    									if (writer != null)
    										writer.close();
    								}
    		        		        //et j'envoie mon Arraylist dans l'activité mére
    								Intent intent = new Intent ();
    								intent.putStringArrayListExtra("FICHIERLISTE", fichierListe);
    		        		    	setResult (RESULT_OK, intent);								
    		        		    	finish ();	
    							}
     
    						});											     		    		
            		    } 					
    				}
    });
    Donc que fichier.txt existe ou pas il est créé ou écrasé, et le contenu de L'Arraylist est bien écrit sous forme d'une liste dans ce fichier.
    A noter que je n'utilise pas le retour chariot \n...ça ne semble pas poser de problème...pour le moment

    Par contre quand je veux récupérer ma variable Arraylist dans mon activité mère et l'afficher dans un textview ça coince:
    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
    public void onActivityResult(int requestCode, int resultCode, Intent data ) {	
    	if (requestCode == SELECT_FILE_REQUEST) {
    		   if (resultCode == RESULT_OK) {
    		        Bundle extras = (data != null) ? data.getExtras () : null;
    			if (extras != null)
    			{     
    				ArrayList<String> fichierListe = new ArrayList<String>();
    				fichierListe = getIntent().getStringArrayListExtra("FICHIERLISTE");
    				StringBuilder b = new StringBuilder();
    				if (fichierListe != null);{
    				for (String s : fichierListe){
    				  b.append(s+"\n");
    				}
    			   textView1 = (TextView) findViewById (R.id.textView1);
    			   textView1.setText(b.toString());}
    ça coince !!! ça plante surJai mis une condition sur valeur de fichierListe non null...pourtant en debug la valeur de fichierListe est affichée comme nulle en balladant le curseur sur la variable??

    J'ai éssayé des trucs tordus comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichierListe.addAll(getIntent().getStringArrayListExtra("FICHIERLISTE"));
    accepté par eclipse...mais pas par l'exécution!

    J'ai l'impression que la maniére de récupérer l'arraylist est cohérente..faut croire que non?

    NOTA: si je convertis mon Arraylist en fichier .txt...c'est que je veux récupérer ces données sur un autre terminal. C'est la solution qui me parrait accessible et évidente pour le moment.

  6. #6
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Euh, attention au point virgule qui se balade:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (fichierListe != null);{
    				for (String s : fichierListe){
    				  b.append(s+"\n");
    				}
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (fichierListe != null){
    				for (String s : fichierListe){
    				  b.append(s+"\n");
    				}

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    ah ben vi!!

    Bien vu...donc ça ne plante plus. Ce qui veut bien dire que ce que je ramène en variable fichierListe depuis l'enfant est vide!!

    La question c'est pourquoi?

  8. #8
    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

    Il y a plein de chose à dire sur les codes postés...

    Utilisation de "private final " ... le terme "final" est a mon avis utilisé exagérément. Je ne suis pas sur qu'une optimisation soit possible vu le code.

    Parceque tout ce que veut dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final File fichier = mAdapter.getItem(position);
    c'est que l'objet référencé par fichier restera toujours le même jusqu'à la fin de la vie de la variable... C'est utile pour des classes anonymes, mais pas toujours.

    Ensuite niveau gestion des exceptions:
    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
     
    PrintWriter writer = null;
    								try{
    									writer = new PrintWriter(new BufferedWriter(new FileWriter("/storage/sdcard0/fichier.txt")));
    									for (String str : fichierListe)
    									{
    										writer.println(str);										
    									}									
    								} catch (IOException ioe) {
    									ioe.printStackTrace();
    								} catch (Exception e) {
    									e.printStackTrace();
    								} finally {
    									if (writer != null)
    										writer.close();
    								}
    		        		        //et j'envoie mon Arraylist dans l'activité mére
    								Intent intent = new Intent ();
    								intent.putStringArrayListExtra("FICHIERLISTE", fichierListe);
    		        		    	setResult (RESULT_OK, intent);								
    		        		    	finish ();
    On est d'accord, que si la "sauvegarde" de la liste n'a pas réussi, ce n'est pas grave ?
    Dans ce cas pourquoi ne pas utiliser une fonction "utilitaire" (privée ou non, statique ou non) pour effectuer cette sauvegarde... Cela rendra le code plus lisible (on recommande en général 1 seule opération par fonction):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         saveListeFichier(fichierListe);
         Intent intent = new Intent();
         intent.putStringArrayListExtra(....);
         ...
    D'autre part, remplacer tous les les e.printStackTrace();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.e("MACLASSE","Erreur pour faire ceci-ou-cela",e);
    Et pour finir, il ne sert à rien de "catcher" IOException puisque le traitement est identique aux autres exceptions.

    Ensuite:
    ça coince !!! ça plante sur
    Code :Sélectionner tout - Visualiser dans une fenêtre à part
    b.append(s+"\n");
    Si ca plante... exception, logcat, tout ça....

    [Boule de cristal on]NullPointerException dans un StringBuilder.append() qui n'est pas celui de b.append, mais celui correspondant à s+"\n"...[/Boule de cristal off]
    Oui parceque là c'est comment utiliser un StringBuilder (bien) en en virant tous les interêts... le code final va ressemble à celui-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (String s : ...) {
        StringBuilder tmp = new StringBuilder(s);
        tmp.append("\n");
        b.append(tmp.toString());
    }
    Donc... il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (String s : ....) {
        b.append(s);
        b.append("\n");
    }
    Et hop plus de plantage.... parce que b.append(null) fonctionne, alors que new StringBuilder(null) non. Oui je pense qu'un des éléments de la liste est null.

    [edit 1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer = new PrintWriter(new BufferedWriter(new FileWriter("/storage/sdcard0/fichier.txt")));
    Un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer = new PrintWriter(new File("/storage/sdcard0/fichier.txt"));
    suffit normalement !

    [edit 2] j'avais pas vu le ; en trop !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Remplace ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fichierListe = getIntent().getStringArrayListExtra("FICHIERLISTE");
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fichierListe = data.getStringArrayListExtra("FICHIERLISTE");

  10. #10
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichierListe = getIntent().getStringArrayListExtra("FICHIERLISTE");
    Va aller checher l'Intent qui a permis de lancer l'activité en premier lieu.

    L'intent de retour c'est "data":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichierListe = data.getStringArrayListExtra("FICHIERLISTE");

    [grilled encore ... grrrr ]
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Bon ben encore merci à vous deux!

    @ nicroman

    ça fait deux semaines que je me suis mis au java:

    Je dirais en substance, que je commence à peine à lire ce langage et que je le parle très mal!

    J'ai besoin de m'atteler à un projet pour progresser et comprendre...sinon je me connais ...j'abandonne.

    Merci de tes conseils pour le nettoyage et les optimisations à venir.

    Pour le privat final..c'est resté parce-que je voulais en rajouter une couche quand j'avais l'impression de perdre ma variable fichierListe.

    @David55

    Purée...j'ai refait la même erreur que précédemment lorsque je voulais ramener mon path de fichier..grrrrrrr!!!!

    Impardonnable...Intent data est dans les paramètres du onActivityResult!!


    Merci les gars.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2015, 11h40
  2. Réponses: 2
    Dernier message: 06/04/2007, 13h31
  3. [VBA-E] Savoir si une cellule est contenue dans une plage
    Par psych0o0 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/05/2006, 14h12
  4. Réponses: 1
    Dernier message: 22/12/2005, 17h28
  5. Réponses: 2
    Dernier message: 08/08/2005, 13h33

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