Aller au contenu

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


Goten44

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);
   }

Modifié par Goten44
Lien vers le commentaire
Partager sur d’autres 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 :|

Modifié par Goten44
Lien vers le commentaire
Partager sur d’autres 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 .. :| )

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 ...

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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

Modifié par Goten44
Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 ... :(

Lien vers le commentaire
Partager sur d’autres 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 :)

Lien vers le commentaire
Partager sur d’autres 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 ...

Lien vers le commentaire
Partager sur d’autres 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. :)

Lien vers le commentaire
Partager sur d’autres 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 ;)
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...