Jump to content
Goten44

Transmettre un ID d'item au "Dialog" de confirmation de suppression

Recommended Posts

Bonjour,

Je travaille sur une application de "Liste de courses" :

https://forum.frandroid.com/forum/viewtopic.php?id=15838

EDIT : Je cherche comment faire (Proprement) un Dialog de confirmation de suppression. (comme dans la galerie photo d'android 1.5 / 1.6)

Processus de suppression :

- long click sur l'item a supprimer

- ca lance un context Menu qui propose l'option DELETE

- l'appui sur DELETE lance un Dialog qui demande confirmation pour la suppression

- un click sur OUI provoque la suppression

Pour le moment je le fait fonctionner mais le code n'est pas propre :

- j'ai une variable globale de mon activity (longClickedItemId) dans laquelle je stocke l'id de l'item

- j'utilise cette variable globale dans le Dialog de confirmation pour supprimer le bon item (grâce à son ID)

Je cherche donc une facon plus propre de transmettre l'id de l'item au dialog ...

(ou alors une autre solution, car j'ai peu d'experience en dev android, et je découvre les Dialog)

merci d'avance ! ;)

voila mon code actuel :

@Override
   public boolean onContextItemSelected(MenuItem item)
   {
       switch(item.getItemId())
       {
           case R.id.main_list_context_menu_delete:
               AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
               longClickedItemId = (int)info.id;

               AlertDialog.Builder builder = new AlertDialog.Builder(this);
               builder.setMessage("This list will be deleted !")
                       .setTitle("Are you sure ?")
                      .setCancelable(false)
                      .setPositiveButton("Yes", new DialogInterface.OnClickListener()
                      {
                          public void onClick(DialogInterface dialog, int id)
                          {
                              shoppingList sl = new shoppingList(longClickedItemId, getApplicationContext());
                              sl.delete();
                              fillList();
                              Toast.makeText(getApplicationContext(), "The list with id "+longClickedItemId+" has been deleted", Toast.LENGTH_SHORT).show();
                          }
                      })
                      .setNegativeButton("No", new DialogInterface.OnClickListener() {
                          public void onClick(DialogInterface dialog, int id) {
                               dialog.cancel();
                          }
                      });
               Dialog dialog_return = builder.create();
               dialog_return.show();





               return true;
           case R.id.main_list_context_menu_edit:
               Toast.makeText(this, "EDIT MODE :D", Toast.LENGTH_SHORT).show();
               return true;
       }
       return super.onContextItemSelected(item);
   }

Edited by Goten44

Share this post


Link to post
Share on other sites

Merci beaucoup,

mais ... si j'ai bien compris c'est pour les items qui sont cochés ...

Dans ma liste ils ne sont pas cochés

(d'ailleurs la méthode getCheckedItemPosition() me retourne INVALID_POSITION)

Est ce que je n'ai pas compris comment faire ?

ou c'est que j'ai mal exprimé mon problème ...? :|

-> Je ne trouve pas comment transmettre au Dialog l'id de l'item qui a ouvert le ContextMenu (et qu'il faut donc supprimer) :mad:

EDIT : SUJET EDITÉ, J'ESPERE QU'IL EST PLUS CLAIR MAINTENANT :|

Edited by Goten44

Share this post


Link to post
Share on other sites

Alors j'ai testé ... mais :

- soit ce n'est pas ce que je cherche

- soit je ne sait pas comment l'utiliser

D'après ce que j'ai compris, ces méthodes retourne des infos sur l'item qui a été "sélectionné"

(un item sélectionné étant un item qui a été mi en surbrillance avec le trackpad ou les flèches directionnelles)

Mais ce que je cherche à faire ... c'est transmettre l'id de l'item sur lequel a été effecté un LongCLick au Dialog ...

(je sais pas si j'exprime correctement ce que je cherche .. :| )

Share this post


Link to post
Share on other sites

En théorie j'aurais dit que si long click il y a, c'est forcément sur l'item sélectionné, mais je me trompe peut-être (même certainement).

Sinon, il y a certainement quelque chose à faire avec ceci : http://developer.android.com/intl/fr/reference/android/widget/AdapterView.AdapterContextMenuInfo.html via une surcharge de http://developer.android.com/intl/fr/reference/android/view/View.OnCreateContextMenuListener.html#onCreateContextMenu(android.view.ContextMenu,%20android.view.View,%20android.view.ContextMenu.ContextMenuInfo) qui peut être faite au niveau de l'Activity

Share this post


Link to post
Share on other sites

Salut,

En effet c'est une erreur, j'ai vérifié :

- on peut sélectionner un item sans cliquer

- un click ou un long click ne provoque pas de selection

J'ai fait des tests (debug etc) pour en arriver à cette conclusion.

Mais je ne t'en veux pas du tout, au contraire ! C'est super sympa d'essayer de m'aider !

Je vais regarder demain matin ce les liens que tu donnes ... :D

Pour résumer actuellement j'ai l'ID de l'item qui a subit le longClick dans le contextMenu

Mais lorsque l'utilisateur choisi DELETE ca lance le dialog de confirmation, et je cherche comment transmettre cet ID d'item au dialog pour que ce dernier supprime le bon item ...

(je pensais que c'était prévu en fait car cette facon de procéder avec le dialog de confirmation est utilisé partout dans android :| )

a+ et merci encore

Share this post


Link to post
Share on other sites

Ca va peut être te paraitre con ce que je vais dire mais :

Pourquoi ne pas stocker l'id dans une variable globale que tu recupères après click sur ok dans la boite de dialogue ?

Long press --> stockage de l'id dans une variable --> click sur delete --> affichage de la boite de dialogue --> OK --> récupération de l'id et suppression ...

Vu que pour deleter tu es obligé de passer par la DELETE + boite de dialogue, cet id correspondra toujours à l'item que tu souhaites supprimer ...

Ou alors via l'héritage éventuellement ...

Share this post


Link to post
Share on other sites

Je viens de me souvenir que j'en avais un dans mon appli EmailAlbum... extrait du code :

   @Override
   public void onCreateContextMenu(ContextMenu menu, View v,
           ContextMenuInfo menuInfo) {
       super.onCreateContextMenu(menu, v, menuInfo);
       posPictureToSave = ((AdapterView.AdapterContextMenuInfo) menuInfo).position;
       menu.setHeaderTitle(R.string.menu_save);
       menu.add(0, MENUCTX_SAVE_SELECTED_ID, 0, R.string.menu_save_selected);
       menu.add(0, MENU_SAVE_ALL_ID, 0, R.string.menu_save_all);
   }

Cela correspond à ce que propose Akex : stockage de l'id dans un attribut de classe pour récupération ultérieure.

Share this post


Link to post
Share on other sites

Des fois, faut pas chercher loin :p ... On essaye tellement de faire compliqué qu'on oublie les actions simples.

Share this post


Link to post
Share on other sites

Merci beaucoup à tout les deux !

J'avais fini par en arriver là :

je stocke l'id dans une variable et je la récupère dans le dialog.

Mais je pensais qu'il y avait une façon plus propre de procéder. :)

Voila ce que donne mon code (codé vite fait :P ) :

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
->STOCKAGE        final int longClickedItemId = (int)info.id;
       switch(item.getItemId())
       {
           case R.id.main_list_context_menu_delete:
               AlertDialog.Builder builder = new AlertDialog.Builder(this);
               builder.setMessage("This list will be deleted !")
                       .setTitle("Are you sure ?")
                       .setCancelable(false)
                       .setPositiveButton("Yes", new DialogInterface.OnClickListener()
                       {
                           public void onClick(DialogInterface dialog, int id)
                           {
-> RECUPERATION    shoppingList sl = new shoppingList(longClickedItemId, getApplicationContext());
                               sl.delete();
                               fillList();
                               Toast.makeText(getApplicationContext(), "The list with id "+longClickedItemId+" has been deleted :D", Toast.LENGTH_SHORT).show();
                           }
                       })
                       .setNegativeButton("No", new DialogInterface.OnClickListener()
                       {
                           public void onClick(DialogInterface dialog, int id)
                           {
                               dialog.cancel();
                          }
                      });
               Dialog dialog_return = builder.create();
               dialog_return.show();
               return true;

Je vais procéder comme ca dorénavant :)

Merci encore pour votre aide !!! :D

Edited by Goten44

Share this post


Link to post
Share on other sites

J'ai trouvé la SOLUTION PROPRE que je cherchais ... :

Faire une classe personalisée qui herite de "Dialog",

et on passe l'id de l'item a supprimer en paramètre du constructeur :D

Je vais essayer ca pour l'edition du nom d'une liste :P

Share this post


Link to post
Share on other sites

C'est de ça dont je parlais quand je disais "héritage". Malheureusement, je ne suis pas chez moi et je n'avais pas la possibilité de chercher en détail.

Bravo en tout cas :)

Share this post


Link to post
Share on other sites

Merci beaucoup ! :D

Je viens de faire un dialog personnalisé pour changer le nom d'une liste de courses,

et ca a marché du premier coup ! je suis bien content de maitriser ça maintenant :lol:

Donc j'ai une classe "EditDialog" qui "extends Dialog" ...

et j'ai une nouvelle interrogation :| :

comment actualiser ma liste lorsque le Dialog est caché ( dismiss() ) ?

Il faut que la fermeture du Dialog lance une fonction (refreshList() par exemple) de mon activity,

ou que le dialog lance cette fonction avant qu'il ne se ferme.

Je voudrais savoir si il a une façon simple de faire ca ...

car je sais le faire mais avec une machine à gaz ... :(

Share this post


Link to post
Share on other sites

Pas sur d'avoir bien compris la question, mais t'as essayé avec un Dialog.setOnDismissListener(listener) tout simplement ? :p

(evidemment, remplacer Dialog par le nom de ta variable de type Dialog)

Share this post


Link to post
Share on other sites

Ou alors, tu peux utiliser la méthode "onResume" de ta classe principale... mais c'est un peu moins "propre".

Share this post


Link to post
Share on other sites

Merci à tout les 3 !

J'avais testé onResume, mais ca plantait ... je ne sais pas comment ca marche...

:| j'ai honte je n'avais meme pas pensé au OnDismissListener.

Share this post


Link to post
Share on other sites

Merci encore !

Ca marche ! :cool:

J'ai utilisé un OnDismissListener dans l'activity qui lance le dialog ;)

(c'est ce qui me semble le plus propre)

et je vais regarder comment marche le notifyDataSetCHanged , car je ne connais pas :)

Share this post


Link to post
Share on other sites

Il rafraichit tout simplement le listview avec les nouvelles données présentes dans le array ou curseur ... Donc, dès que tu ajoutes un élément ou en supprime un, suffit que tu appelle notifyDatasetChanged() et l'adapter s'occupe du reste ...

Share this post


Link to post
Share on other sites

merci akex, mais il faut que j'appelle cette méthode dans l'adapter de ma listView ?

(cursor adapter pour moi )

Share this post


Link to post
Share on other sites

Je ne suis pas sûr, mais je dirais que tu dois appeler la méthode à l'endroit où tu arrives après une insertion de données : dans le onClickListener du bouton, dans le onResume, dans le onActivityResult, etc. :)

Share this post


Link to post
Share on other sites

Au fait je me permets de faire un peu de HS car le début de ce thread m'a intrigué, j'ai vu que Goten utilisait des ContextMenu, alors je sais que c'est pratique mais chez moi quand je tourne l'ecran il me fait planter, vous avez pas de probleme avec ca vous ? (parce que du coup je passe par un AlertDialog avec un .setItems, ce qui n'est pas dérangeant mais si je pouvais me servir du ContextMenu je cracherais pas dessus :p)

PS :

shoppingList sl = new shoppingList(longClickedItemId, getApplicationContext());
je vais t'embeter mais la convention veut que toutes les classes commencent par une majuscule ;)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.






×
×
  • Create New...