Invité Posté(e) 7 août 2010 Share Posté(e) 7 août 2010 (modifié) 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é 7 août 2010 par Goten44 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 7 août 2010 Share Posté(e) 7 août 2010 Un coup d'oeil sur http://d.android.com/reference/android/widget/ListView.html#getCheckedItemIds() http://d.android.com/reference/android/widget/ListView.html#getCheckedItemPosition() Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 7 août 2010 Share Posté(e) 7 août 2010 (modifié) 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é 7 août 2010 par Goten44 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 7 août 2010 Share Posté(e) 7 août 2010 Oups, désolé, j'ai répondu un peu trop vite... en fait c'est plutôt là qu'il faut aller voir : http://d.android.com/reference/android/app/ListActivity.html#getSelectedItemId() http://d.android.com/reference/android/app/ListActivity.html#getSelectedItemPosition() Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 8 août 2010 Share Posté(e) 8 août 2010 Merci beaucoup Nivek ! :lol: Dans mon cas ce n'est pas une ListActivity mais une ListView mais ces méthodes sont aussi disponibles pour la ListView : http://developer.android.com/reference/android/widget/AdapterView.html#getSelectedItemId() je vais essayer ca :P Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 8 août 2010 Share Posté(e) 8 août 2010 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 .. :| ) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 8 août 2010 Share Posté(e) 8 août 2010 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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 8 août 2010 Share Posté(e) 8 août 2010 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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 8 août 2010 Share Posté(e) 8 août 2010 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 ... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 Des fois, faut pas chercher loin :p ... On essaye tellement de faire compliqué qu'on oublie les actions simples. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 (modifié) 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é 9 août 2010 par Goten44 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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 :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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 ... :( Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 Normalement on fait appel à ça : http://d.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged() Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Random Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Puni Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 Ou alors, tu peux utiliser la méthode "onResume" de ta classe principale... mais c'est un peu moins "propre". Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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 :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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 ... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Invité Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 merci akex, mais il faut que j'appelle cette méthode dans l'adapter de ma listView ? (cursor adapter pour moi ) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Puni Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 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. :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 9 août 2010 Share Posté(e) 9 août 2010 merci akex, mais il faut que j'appelle cette méthode dans l'adapter de ma listView ?(cursor adapter pour moi ) Non pas besoin, c'est une méthode publique. http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged() Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Random Posté(e) 11 août 2010 Share Posté(e) 11 août 2010 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 ;) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.