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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 confirmé

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

  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 confirmé

    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
    Par défaut
    Bonjour,

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

    http://developer.android.com/referen...tMenuListener)

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