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 :

Ajouter une valeur à une ListView


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Par défaut Ajouter une valeur à une ListView
    Bonjour à tous,

    Dans mon application Android, j'ai une activité qui contient un bouton permettent de créer de nouveaux profils. Voilà le layout de l'activité :

    Fichier creation.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        <LinearLayout>
              <TextView/>
              <Button/>
              <ListView> <ListView/>
        </LinearLayout>
    La ListView contient la liste des profils créés.
    En cliquant sur le bouton (Button), une boite de dialogue se lance (AlertDialog), ayant ce layout :

    Fichier profil.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        <LinearLayout>
              <TextView/>
              <EditText/>
        </LinearLayout>
    Cette boite de dialogue permet de créer un nouveau profil. on valide en cliquant sur le bouton "Enregistrer" (PositiveButton) ou on annule en cliquant sur le bouton "Annuler" (NegativeButton).
    La validation devrait ajouter le profil créé à la ListView. C'est ici que mon problème se pose.

    Voilà le code de création :
    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
     
            private Button creation;
    	private Intent intent;
    	private ListView profilList, list;
    	private ArrayAdapter<String> listadapter;
    	private EditText edit;
    	private String[] values;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
     
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.creation_profil);
     
    		edit = (EditText) findViewById(R.id.NameProfil);
     
    		creation = (Button) findViewById(R.id.creation);
    		creation.setOnClickListener(this);
     
     
    		list = creerListView();
    	}
     
    	@Override
    	public void onClick(View v) {
    		if (v == creation){
    			afficherBoiteProfil();
    		}
     
    	}
     
    	private ListView creerListView(){
    		profilList = (ListView) findViewById(R.id.profilList);
    		values = new ArrayList();
    		listadapter = new ArrayAdapter(this, 
    				android.R.layout.simple_list_item_1, android.R.id.text1, values);
    		profilList.setAdapter(listadapter);
    		profilList.setOnItemClickListener(new OnItemClickListener() {
     
    			@Override
    			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
    					long arg3) {
    				// TODO Auto-generated method stub
     
    			}
     
    		});
    		return profilList;
    	}
     
    	private void afficherBoiteProfil(){
     
    		//On instancie notre layout en tant que View
    		LayoutInflater factory = LayoutInflater.from(this);
    		final View alertDialogView = factory.inflate(R.layout.creation, null);
     
     
    		//creation de l'alerteDialog
    		AlertDialog.Builder createProfilDialog = new     AlertDialog.Builder(this);
    		createProfilDialog.setView(alertDialogView);
    		createProfilDialog.setTitle("Création d'un profil");
    		createProfilDialog.setIcon(R.drawable.add_user32);
    		createProfilDialog.setPositiveButton("Enregistrer", 
    				new  DialogInterface.OnClickListener() {
     
    					@Override
    					public void onClick(DialogInterface dialog, int which) {
    						String value = edit.getText().toString();
    						listadapter.add(value);
    						intent = new Intent(getApplicationContext(), CreationProfil.class); 
    						startActivity(intent);
    					}
    				});
    		createProfilDialog.setNegativeButton("Annuler", null);
    		createProfilDialog.show();
    	}
    Le contenu de ma Liste est défini par le tableau de String "values".
    En cliquant sur le bouton "Enregistrer", l'application se plante!

    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 169
    Par défaut
    Il nous faudrait le Logcat pour pouvoir t'aider. Il y a plusieurs erreurs possibles:
    - Ton activité n'est pas dans le manifest.
    - Tu n'as pas appelé notifyDataSetChanged sur l'adapter après avoir changé ses données.
    - etc..

  3. #3
    Membre confirmé Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Par défaut
    Salut,

    Merci pour la réponse.
    L'activité CreationProfil.java est bien déclarée dans le Manifest.

    - Tu n'as pas appelé notifyDataSetChanged sur l'adapter après avoir changé ses données.
    Aucune idée de cette méthode.

    Voilà le logcat :
    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
     
    09-25 09:35:29.529: E/AndroidRuntime(1117): 	at java.lang.reflect.Method.invokeNative(Native Method)
    09-25 09:35:29.529: E/AndroidRuntime(1117): 	at java.lang.reflect.Method.invoke(Method.java:521)
    09-25 09:35:29.529: E/AndroidRuntime(1117): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
    09-25 09:35:29.529: E/AndroidRuntime(1117): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
    09-25 09:35:29.529: E/AndroidRuntime(1117): 	at dalvik.system.NativeStart.main(Native Method)
    09-25 14:03:47.759: E/AndroidRuntime(1152): Uncaught handler: thread main exiting due to uncaught exception
    09-25 14:03:47.769: E/AndroidRuntime(1152): java.lang.NullPointerException
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at acsyo.work.testPsyTech.CreationProfil$2.onClick(CreationProfil.java:88)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at android.os.Looper.loop(Looper.java:123)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at android.app.ActivityThread.main(ActivityThread.java:3948)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at java.lang.reflect.Method.invokeNative(Native Method)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at java.lang.reflect.Method.invoke(Method.java:521)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
    09-25 14:03:47.769: E/AndroidRuntime(1152): 	at dalvik.system.NativeStart.main(Native Method)
    J'attend votre réponse

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Je pense qu'il te manque ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createProfilDialog.create();
    ou alors, un listener null est interdit à cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createProfilDialog.setNegativeButton("Annuler", null);


    Par ailleurs, tu utilises un Builder, qui te permet de faciliter l'écriture du code, mais pas complètement.
    Normalement il te suffit de faire :
    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
     
    		new AlertDialog.Builder(this)
    		.setView(alertDialogView)
    		.setTitle("Création d'un profil")
    		.setIcon(R.drawable.add_user32)
    		.setPositiveButton("Enregistrer", 
    				new  DialogInterface.OnClickListener() {
     
    					@Override
    					public void onClick(DialogInterface dialog, int which) {
    						String value = edit.getText().toString();
    						listadapter.add(value);
    						intent = new Intent(getApplicationContext(), CreationProfil.class); 
    						startActivity(intent);
    					}
    				})
                     //etc
    		.create()
    		.show();

  5. #5
    Membre confirmé Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Par défaut
    Merci pour la réponse.

    Pour la méthode create(), j'ai vu que la boite de dialogue est bien créé sans appel à cette méthode. Il y a un problème que je vois pas quand je l'appelle pas ?!!

    un listener null est interdit à cet endroit :
    createProfilDialog.setNegativeButton("Annuler", null);
    Le bouton "Annuler" sert à fermer la boite de dialogue et retourner sur l'activité qui a ouvert cette boite de dialogue. Donc, j'ai vu qu'il est plus facile de mettre un listener null au lieu de créer un listener etc...
    Je veux comprendre pourquoi un listener null est interdit ?!

    Par ailleurs, tu utilises un Builder, qui te permet de faciliter l'écriture du code, mais pas complètement.
    Oui je sais que ça revient au même mais je préfère écrire chaque méthode en une ligne toute seule, je trouve que c'est plus lisible pour moi

    En attendant votre aide, je suis en train de voir des exemples sur la méthode notifyDataSetChanged().

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Citation Envoyé par JQueen Voir le message
    Je veux comprendre pourquoi un listener null est interdit ?!
    Ce n'était qu'une supposition, mais c'est pas forcément interdit (juste bizarre pour moi)

    Citation Envoyé par JQueen Voir le message
    Oui je sais que ça revient au même mais je préfère écrire chaque méthode en une ligne toute seule, je trouve que c'est plus lisible pour moi
    Mais dans mon exemple elles sont déjà toutes sur des lignes différentes. Enfin bref, à toi de voir
    Citation Envoyé par JQueen Voir le message
    En attendant votre aide, je suis en train de voir des exemples sur la méthode notifyDataSetChanged().
    Cette méthode ne sert qu'à rafraichir visuellement l'affichage lorsqu'un élément de la liste a changé.


    L'erreur vient tout simplement de la ligne 88 de la classe CreationProfil. Peux tu nous dire ce qu'il y a à cet endroit ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 169
    Par défaut
    Un listener null n'est pas interdit, c'est même une bonne chose pour ma part. Ça évite d'instancier un nouvel objet pour ceux qui font tout en inner-class.

    Concernant ton problème, tu as essayés de faire un un createProfilDialog.create().show() à la palce de createProfilDialog.show() ?

    Pour notifyDataSetChanged() c'est juste une fonction que tu dois impérativement appeler quand tu modifies les données dans ton adapter.
    Ici pour la fonction add de ArrayAdapter, la méthode est appelée en interne donc tu n'as pas besoins de la rappeler. Mais c'est toujours bon à savoir

    Edit: Simon a été plus rapide que moi

  8. #8
    Membre confirmé Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Par défaut
    L'erreur vient tout simplement de la ligne 88 de la classe CreationProfil. Peux tu nous dire ce qu'il y a à cet endroit ?
    A cette ligne, se trouve la premiére ligne de la méthode onClick :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String value = edit.getText().toString();
    Concernant ton problème, tu as essayés de faire un un createProfilDialog.create().show() à la palce de createProfilDialog.show() ?
    J'ai jamais utilisé la méthode create().

    Des idées ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/01/2008, 14h44
  2. ajouter des valeurs à une liste déroulante
    Par Simon2 dans le forum IHM
    Réponses: 3
    Dernier message: 30/07/2007, 23h59
  3. Réponses: 6
    Dernier message: 21/04/2007, 02h11
  4. Réponses: 1
    Dernier message: 25/09/2006, 17h15
  5. Ajout d'une valeur à une liste
    Par NicoNGRI dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/01/2005, 12h34

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