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 :

Context menu et listview impossible de récupérer la position de l'item de la listView cliqué


Sujet :

Composants graphiques Android

  1. #1
    Invité
    Invité(e)
    Par défaut Context menu et listview impossible de récupérer la position de l'item de la listView cliqué
    Salut à tous,

    Alors voilà, j'ai une liste d'item contenu dans une arraylist, et j'ai créer un menu d'options et un context menu.
    Je me suis rendu compte que le context menu ne tenait pas compte de l'item sur lequel je cliquait. En effet si je met une action sur une des options du menu, elle s'apliquera à toute mon arraylist, et pas uniquement à l'item sur lequel j'ai cliqué pour faire apparaître le menu.

    voici mon code pour ce menu :
    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
     public void onCreateContextMenu(ContextMenu menu_item,View v,ContextMenuInfo menuInfo) 
         {
            super.onCreateContextMenu(menu_item, v, menuInfo);
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu_itemlist, menu_item);        
         }
         public boolean onContextItemSelected(MenuItem item)
         {
          switch (item.getItemId()) {
     
          	 case R.id.see_item:        
            	  Toast.makeText(this, "drawing of detail's alarm", Toast.LENGTH_SHORT).show();       	 
          		 this.lancementDetailAlarm(0);
                 return true;
     
             case R.id.ack_item:        
            	if (varack == 0){
            		varack = 1;     
                 	ListView list = (ListView)findViewById(R.id.listalarme);
                	AlarmeAdapter adapter = (AlarmeAdapter)list.getAdapter();
                	adapter.ackbutton.setVisibility(0); // n'efface pas l'étoile
                    adapter.notifyDataSetChanged(); 
                    Toast.makeText(this, "this alarm is acknowledged", Toast.LENGTH_SHORT).show();
            	}
            	else {
            		Toast.makeText(this, "you have already ack this alarm", Toast.LENGTH_SHORT).show();
            	}
            	return true;
             }
             return super.onContextItemSelected(item);
          }
    Si on prend l'exemple de "ack_item" j'aimerais lorsque je le choisi que seul un élèment de l'arraylist est la variable varack qui passe à 1, or tous les élèment passe cette variable à un car aprés j'affiche toujours le deuxième message toast.

    Je ne sais pas si ce que je veux est possible en gardant un seul menu? il faut que j'arrive à récupérer la position des item de mon arraylist et à en faire un paramètre de mon menu mais comment?
    Dernière modification par Invité ; 08/07/2011 à 10h11.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je pense avoir trouvé comment résoudre mon problème en suivant ce tuto, mais je n'ai pas réussi à l'adapter à mon programme.

    Voici mon nouveau 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
    public void onCreateContextMenu(ContextMenu menu_item,View v,ContextMenuInfo menuInfo) 
         {
            super.onCreateContextMenu(menu_item, v, menuInfo);
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu_itemlist, menu_item);
         }
     
         public boolean onContextItemSelected(MenuItem item)
         {
          ListView list = (ListView)findViewById(R.id.listalarme);  
          AdapterView.AdapterContextMenuInfo info= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
          AlarmeAdapter adapter = (AlarmeAdapter)list.getAdapter();
          long id = adapter.getItemId(info.position);
          switch (item.getItemId()) {
     
          	 case R.id.see_item:        
            	 //ne fonctionne pas
     
            	Toast.makeText(this, "drawing of detail's alarm", Toast.LENGTH_SHORT).show(); 
          		this.lancementDetailAlarm(info.position);
                 return true;
    }
             return super.onContextItemSelected(item);
          }
    Mais je n'utilise jamais "id" qui me permet de récupérer ma position, je ne peux pas mettre lancementDetailAlarm(id) car cette fonction n'accepte qu'un int comme paramétre. et en mettant comme si dessus info.position j'ai une erreur java.NullPointerException.
    Si quelqu'un pouvait m'aider merci =)

    ---EDIT---
    Le problème vient-il du fait que ma classe extends Activity plutot que ListActivity?
    Dernière modification par Invité ; 08/07/2011 à 11h09.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Dans la doc on peut voir
    public long id
    The row id of the item for which the context menu is being displayed.
    Cela signifie qu'il faut un id pour chaque ligne? or je crée ma liste en java et pas à partir d'un fichier xml, et mon activity n'est pas une listActivity, je n'est donc pas d'id pour chaque ligne, il est donc normal que cela me renvoie un nullPointerException, de même que le info.position dans mon code.

    Mais dans ce cas comment faire pour que le context menu fonctionne avec ma liste?

  4. #4
    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
    Bonjour,

    Cela signifie qu'il faut un id pour chaque ligne? or je crée ma liste en java et pas à partir d'un fichier xml, et mon activity n'est pas une listActivity, je n'est donc pas d'id pour chaque ligne, il est donc normal que cela me renvoie un nullPointerException, de même que le info.position dans mon code.
    Je pense que ton erreur nullPointerException est sur la variable info , peux tu regarder ce que tu as dans cette variable :
    - dans le onCreateContextMenu -> menuInfo
    - dans le onContextItemSelected -> info


    Merci .
    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.

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.i("tag menuinfo","menuinfo :" + menuInfo.toString());
    dans le OnCreateContextMenu et j'obtiens le logcar suivant :
    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
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090): FATAL EXCEPTION: main
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090): java.lang.NullPointerException
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.julie.ManagementAlarm.onCreateContextMenu(ManagementAlarm.java:137)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.view.View.createContextMenu(View.java:4222)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.android.internal.view.menu.ContextMenuBuilder.show(ContextMenuBuilder.java:81)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.android.internal.policy.impl.PhoneWindow$DecorView.showContextMenuForChild(PhoneWindow.java:1860)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.view.View.showContextMenu(View.java:2444)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.app.Activity.openContextMenu(Activity.java:2390)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.julie.ManagementAlarm.OnClick(ManagementAlarm.java:52)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.julie.AlarmeAdapter.sendListener(AlarmeAdapter.java:139)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.julie.AlarmeAdapter.access$1(AlarmeAdapter.java:130)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.julie.AlarmeAdapter$2.onClick(AlarmeAdapter.java:93)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.view.View.performClick(View.java:2408)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.view.View$PerformClick.run(View.java:8816)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.os.Handler.handleCallback(Handler.java:587)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.os.Handler.dispatchMessage(Handler.java:92)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.os.Looper.loop(Looper.java:123)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at java.lang.reflect.Method.invoke(Method.java:521)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    07-08 11:38:33.490: ERROR/AndroidRuntime(1090):     at dalvik.system.NativeStart.main(Native Method)
    la ligne 137 étant celle que j'ai rajouté.

    et dans le OnContextItemSelected j'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.i("tag info","info :"+info.toString());
    et le logcat est :
    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
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118): FATAL EXCEPTION: main
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118): java.lang.NullPointerException
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at com.julie.ManagementAlarm.onContextItemSelected(ManagementAlarm.java:148)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at android.app.Activity.onMenuItemSelected(Activity.java:2199)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback.onMenuItemSelected(PhoneWindow.java:2744)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:137)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:874)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at android.widget.ListView.performItemClick(ListView.java:3382)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at android.os.Handler.handleCallback(Handler.java:587)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at android.os.Handler.dispatchMessage(Handler.java:92)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at android.os.Looper.loop(Looper.java:123)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at java.lang.reflect.Method.invoke(Method.java:521)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    07-08 11:40:46.680: ERROR/AndroidRuntime(1118):     at dalvik.system.NativeStart.main(Native Method)
    la ligne 148 est celle que j'ai rajouté. Donc tu as raison l'erreur est plutôt sur la variable info.
    Faut-il obligatoirement passer par une listActivity pour utiliser un contextmenu avec une listview?

  6. #6
    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
    Bonjour,

    As tu bien lié ton ContextMenu à ta ListView via un setOnCreateContextMenuListener?

    http://developer.android.com/referen...tMenuListener)
    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.

  7. #7
    Invité
    Invité(e)
    Par défaut
    j'avais utiliser un listener mais pas celui là j'ai donc changé mon code et rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    list.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
     
    			@Override
    			public void onCreateContextMenu(ContextMenu menu_item, View v,ContextMenuInfo menuInfo) {
    				//super.onCreateContextMenu(menu_item, v, menuInfo);
    		        MenuInflater inflater = getMenuInflater();
    		        inflater.inflate(R.menu.menu_itemlist, menu_item);
     
    			}
     
            });
            registerForContextMenu(list);
    dans le OnCreate de mon activity (c'est bien là qu'il faut mettre ce listener?) mais quand je vais un long click sur ma listview le menu contextuel ne s'affiche pas.

    Si je décommente la ligne commenté ci-dessus elle est souligné en rouge pas Eclipse et celà me met une erreur.

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

    Je ne sais pas si je suis juste mais le registerForContextMenu(list); te permet de linker le onCreateContextMenu de ton activity à ta view ( soit ici ta ListView).

    En passant par le listener setOnCreateContextMenuListener de ta listview tu n'as plus besoin de linker ce le onCreateContextMenu à ton activity .

    Donc par déduction je dirais soit laisse le registerForContextMenu(list) et regarde ce que tu obtiens dans le OnCreateContextmenu de ton Activity .

    Soit garde le listener sur ta listView et regarde ce que tu obtiens dans le OnCreateContextMenu de ta ListView.

    Edit ::
    Si je décommente la ligne commenté ci-dessus elle est souligné en rouge pas Eclipse et celà me met une erreur.
    La réponse :

    http://developer.android.com/referen...uListener.html
    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.

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai l'impression que je rentre pas dans ce listener, j'ai enlever le registerForcontextView et il ne se passe toujours rien lorsque je fais un clic long. j'ai rajouté des log dans la fonction mais je le les affiche pas.

    Je dois bien mettre le listener dans le OnCreate de mon activity? puis dans ce listener le OnCreateContextMenu

    et mon onContextItemSelected se trouve en dehors du onCreate de mon activity?

    Je te met mon code complet pour le moment, ça sera peut-être plus clair j'éspère.
    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
    public class ManagementAlarm extends Activity implements AlarmeAdapterListener{
    	/** Called when the activity is first created. */
    	public static boolean longClick = false;
    	public  static ArrayList<ListAlarme> listP;
    	public ListView list;
    	int i = 0;
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            listP = ListAlarme.getAListOfAlarms();
            AlarmeAdapter adapter = new AlarmeAdapter(this, listP,AlarmeAdapter.NO_ACKKED);
            adapter.addListener(this); 
            list = (ListView)findViewById(R.id.listalarme);
            list.setAdapter(adapter);
            list.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
     
    			@Override
    			public void onCreateContextMenu(ContextMenu menu_item, View v,ContextMenuInfo menuInfo) {
    				//super.onCreateContextMenu(menu_item, v, menuInfo);
    		        MenuInflater inflater = getMenuInflater();
    		        inflater.inflate(R.menu.menu_itemlist, menu_item);	
     
    			}
     
            });
            //registerForContextMenu(list);
         }
     
        /**---------------------------------menu contextuel-----------------------------------------*/
     
     /**    public void onCreateContextMenu(ContextMenu menu_item,View v,ContextMenuInfo menuInfo) 
         {
            super.onCreateContextMenu(menu_item, v, menuInfo);
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu_itemlist, menu_item);
          //  Log.i("tag menuinfo","menuinfo :" + menuInfo.toString());
         }*/
     
         public boolean onContextItemSelected(MenuItem item)
         {
          ListView list = (ListView)findViewById(R.id.listalarme);  
          AdapterContextMenuInfo info= (AdapterContextMenuInfo) item.getMenuInfo(); 
          AlarmeAdapter adapter = (AlarmeAdapter)list.getAdapter();
        //  long id = adapter.getItemId(info.position);
          switch (item.getItemId()) {
     
          	 case R.id.see_item:        
                  //lancement de la deuxième activity
            	Toast.makeText(this, "details of this alarm" , Toast.LENGTH_SHORT).show();        	
          	//	this.lancementDetailAlarm(info.position);
                 return true;
     
             case R.id.ack_item:    
                 Toast.makeText(this, "this alarm is acknowledged", Toast.LENGTH_SHORT).show();               	 
            	return true;
     
             case R.id.reset_item:
             	Toast.makeText(this, "alarm is reset", Toast.LENGTH_SHORT).show();
                          return true;
             }
             return super.onContextItemSelected(item);
          }
    }

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Je suis désolé mais je ne suis pas sure sur de comprendre :s


    ---EDIT----
    J'utilise une classe adapter dans mon programme et j'ai essayé de mettre le listener dans cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	public boolean OnLongClick(ListAlarme item, int position)
    et quand je fais un clic long je rentre bien dans le onlongclic, mais pas dans le listener. J'avais réussi à afficher le context menu avant en mettant le registerForContextMenu dans le onLongclic, mais comme il ne fonctionnait pas comme je voulais je suis passé par le listener que tu m'as conseillé.

  11. #11
    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
    Bonjour,

    Essaye ce qui est proposé dans ce tutoriel pour voir ce que cela donne , j'ai pas d'eclipse sur moi en ce moment .

    http://coderzheaven.com/2011/03/16/c...nu-in-android/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)
        {
            // TODO Auto-generated method stub
             menu.setHeaderTitle("ContextMenu");
             for (int i = 0; i<5; i++)
             {
                 menu.add(0, 0,0, "favorite"+i);
             }
        }
    Edit :

    Je suis désolé mais je ne suis pas sure sur de comprendre :s
    Ben tu n'as pas de procédure redéfini puisque tu l'implémentes directement , donc pas de super. .
    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.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bon le tuto marche nickel, je n'ai plus qu'à essayer de l'adapter à mon programme.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Que je passe par le listener ou pas j'ai le même problème le menu ne se lance pas le un clic long (ou court d'ailleur).
    Je dois rajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Override
    	public boolean OnLongClick(ListAlarme item, int position) 
    	{
    		openContextMenu((ListView)findViewById(R.id.listalarme));
    			    return false;
    	}
    et là je le lance

    Je vais voir si maintenant ce menu marche mieux, et si c'est le cas ça ne me pose pas de problème de passer par ce onLongClick, mais par curiosité j'aimerais comprendre pourquoi je suis obligé de faire comme celà :s

    ---EDIT---

    J'ai toujours ce problème de info.position qui provoque une erreur NullPointerExecption :s

    Il vaut bien juste rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     AdapterContextMenuInfo info= (AdapterContextMenuInfo) item.getMenuInfo();
    dans le onContextItemSelected ?

  14. #14
    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
    Bonjour,

    Je viens d'écrire un tuto! Peut être peux tu t'en inspirer

    Regarde ici

    Ce n'est pas tout à fais pareil mais bon ca peux toujours être utile dans ton cas

  15. #15
    Invité
    Invité(e)
    Par défaut
    Merci David55, j'avais déja regardé ton tuto, et même si je l'ai trouvé intéréssant il n'a pas vraiment pu m'aider, mon problème venant plus de mon menu que de ma listview (enfin je crois)

  16. #16
    Invité
    Invité(e)
    Par défaut
    Je n'ai toujours pas résolu ce problème :s j'ai regardé un tuto sur le context view dont voici le 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class CML extends Activity { 
    	/** Called when the activity is first created. */ 
    	ListView list; 
    	private List<String> 
    	List_file; 
    	public void onCreate(Bundle savedInstanceState) { 
    		super.onCreate(savedInstanceState); 
    		setContentView(R.layout.main); 
    		List_file =new ArrayList<String>(); 
    		list = (ListView)findViewById(R.id.listview); 
    		CreateListView(); 
     
    		list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { 
    			public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { 
    				// TODO Auto-generated method stub 
    				menu.setHeaderTitle("ContextMenu"); 
    				for (int i = 0; i<5; i++) { menu.add(0, 0,0, "favorite"+i); }
    				} 
    			});
    		} 
    	private void CreateListView() { 
    		List_file.add("bird"); List_file.add("cat"); 
    		List_file.add("dog"); List_file.add("tiger"); 
    		List_file.add("goat"); 
    		//Create an adapter for the listView and add the ArrayList to the adapter. 
    		list.setAdapter(new ArrayAdapter<String>(CML.this, android.R.layout.simple_list_item_1,List_file));
    		registerForContextMenu(list); 
    		list.setOnItemClickListener(new OnItemClickListener() { 
    			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    				// TODO Auto-generated method stub 
    				Toast.makeText(CML.this, "clicked", Toast.LENGTH_LONG).show(); 
    				} 
    			}); 
    		}
    	 public boolean onContextItemSelected(MenuItem item)
         {
    		 switch(item.getItemId()){
     
    		 }
    		return false;
         }
    }
    Mais celà j'arrive à l'obtenir dans mon programme. Est-il possible pour le context view si dessus d'afficher un toast différent selon le favoris (ça c'est facile) mais aussi selon l'item cliqué. par exemple j'afficherais "j'ai choisi favoris 2 en cliquant sur cat"? cela me montrerais qu'il est possible de récupérer la position de l'item dans l'arraylist. C'est ça que je n'arrive pas à faire dans mon programme...

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 322
    Points : 494
    Points
    494
    Par défaut
    Bonjour,

    As tu essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void CreateListView() { 
    		List_file.add("bird"); List_file.add("cat"); 
    		List_file.add("dog"); List_file.add("tiger"); 
    		List_file.add("goat"); 
    		//Create an adapter for the listView and add the ArrayList to the adapter. 
    		list.setAdapter(new ArrayAdapter<String>(CML.this, android.R.layout.simple_list_item_1,List_file));
    		registerForContextMenu(list); 
    		list.setOnItemClickListener(new OnItemClickListener() { 
    			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    				// TODO Auto-generated method stub 
    				Toast.makeText(CML.this, "j'ai choisi favoris " + arg2 +" en cliquant sur " + list_file.get(arg2).toString(), Toast.LENGTH_LONG).show(); 
    				} 
    			}); 
    		}

  18. #18
    Invité
    Invité(e)
    Par défaut
    Je n'ai pas essayé ce que tu propose car ce n'est pas ce que je veux. Si je fais un OnItemClickListener il est facile de récupérer la position de l'item, ce que je veux c'est récupérer la position de l'item lorsque j'ai lancé mon contextmenu.

    J'ai changé le code de mon menu cela sera peut-être plus clair, et surtout plus proche de mon programme :
    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
     public boolean onContextItemSelected(MenuItem item)
         {
    		 switch(item.getItemId()){
    		 case R.id.f0 :
    				Toast.makeText(CML.this, "j'ai choisi favoris 0" +" en cliquant sur " + "nom cliqué" , Toast.LENGTH_LONG).show(); 
    			break;
         	case R.id.f1 :
    			Toast.makeText(CML.this, "j'ai choisi favoris 1" + "numéro du favori cliqué" +" en cliquant sur " + "nom cliqué" , Toast.LENGTH_LONG).show(); 
    			break;
         	case R.id.f2 :
    			Toast.makeText(CML.this, "j'ai choisi favoris 2" + "numéro du favori cliqué" +" en cliquant sur " + "nom cliqué" , Toast.LENGTH_LONG).show(); 
    			break;
         	case R.id.f3 :
    			Toast.makeText(CML.this, "j'ai choisi favoris 3" + "numéro du favori cliqué" +" en cliquant sur " + "nom cliqué" , Toast.LENGTH_LONG).show(); 
    			break;
         	case R.id.f4 :
    			Toast.makeText(CML.this, "j'ai choisi favoris 4" + "numéro du favori cliqué" +" en cliquant sur " + "nom cliqué" , Toast.LENGTH_LONG).show(); 
    			break;
    		return false;
         }
    C'est dans cette partie du code que j'ai besoin de récupérer la position de mon item et que je n'y arrive pas. à la place de "nom cliqué" j'aimerais afficher "cat" si j'ai appuyé sur cat pour faire apparaitre le menu.

  19. #19
    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
    Bonjour,


    je comprends pas pourquoi le ContextMenu ne marcherait pas ,
    tu as un autre tutoriel ici plus complet , il faut que tu regardes le deuxième exemple et voir ce que tu as dans le MenuInfo
    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.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Effectivement avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AdapterContextMenuInfo info= (AdapterContextMenuInfo) item.getMenuInfo(); 
    		 switch(item.getItemId()){
    		 case R.id.f0 :
    				Toast.makeText(CML.this, "j'ai choisi favoris 0 " +" en cliquant sur l'item à la position" + info.position , Toast.LENGTH_LONG).show(); 
    			break;
    je récupére bien la position de l'item.
    Mais dans mon programme j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public boolean onContextItemSelected(MenuItem item)
         {
          AdapterContextMenuInfo info= (AdapterContextMenuInfo) item.getMenuInfo(); 
          switch (item.getItemId()) {
     
          	 case R.id.see_item:        
     
            	Toast.makeText(this, "details of this alarm" + info.position , Toast.LENGTH_SHORT).show();        	
                 break;
    j'obtiens un nullpointerException sur le info.position :s

Discussions similaires

  1. Context menu sur expandable listview de plusieurs niveaux
    Par Willy55 dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 13/03/2015, 10h34
  2. Réponses: 0
    Dernier message: 26/10/2014, 15h32
  3. position d'un item d'un listView via setOnTouchListener
    Par drick35 dans le forum Composants graphiques
    Réponses: 5
    Dernier message: 28/06/2013, 09h02
  4. Impossible de récupérer la valeur d'un menu déroulant
    Par kyake dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/10/2009, 16h00
  5. [Security] Acegi - Impossible de récupérer le contexte
    Par sgen13 dans le forum Spring
    Réponses: 1
    Dernier message: 21/07/2009, 12h54

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