J'ai trouvé une réponse sur Steve Oliver blog ici: http://steveoliverc.wordpress.com/2009/10/16/context-menus-for-expandable-lists/
Vous devez utiliser onCreateContextMenu()
au lieu de rechercher l' setOnChildLongClickListener()
. Voici Steve info:
Une liste extensible prend en charge les menus contextuels dans à peu près de la même façon qu'une liste standard n': ajouter un écouteur pour le menu contextuel (lorsque l'utilisateur a longtemps appuyé sur un élément de liste). Contrairement à une norme d'affichage de liste, toutefois, vous voulez probablement savoir si l'utilisateur a sélectionné un groupe (extensible élément) ou un enfant (sous-élément) de l'élément de liste.
En outre, vous ne pourriez pas vouloir faire quelque chose si l'utilisateur tente d'afficher un menu contextuel sur un élément du groupe. Il pourrait y avoir des cas où vous voulez faire quelque chose pour tous les enfants de moins de un groupe, mais dans mon Librarium application, je voulais ignorer les éléments de groupe et de présenter le menu contextuel que pour les enfants.
Tout d'abord, vous devez savoir lorsque le menu contextuel va être créé afin que vous puissiez déterminer si l'utilisateur a appuyé sur un groupe ou un enfant. Si ils ont fait pression sur un groupe, puis annuler le menu contextuel. Cela nous donne également une chance d'obtenir le texte de l'enfant, de sorte que nous pouvons le mettre dans l'en-tête du menu de contexte.
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
ExpandableListView.ExpandableListContextMenuInfo info =
(ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
int type =
ExpandableListView.getPackedPositionType(info.packedPosition);
int group =
ExpandableListView.getPackedPositionGroup(info.packedPosition);
int child =
ExpandableListView.getPackedPositionChild(info.packedPosition);
// Only create a context menu for child items
if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD)
{
// Array created earlier when we built the expandable list
String page =mListStringArray[group][child];
menu.setHeaderTitle(page);
menu.add(0, MENU_READ, 0, "Read page");
menu.add(0, MENU_EDIT, 0, "Edit page");
menu.add(0, MENU_FAVORITE, 0, "Add page to favorites");
menu.add(0, MENU_EXPORT, 0, "Export page to file");
menu.add(0, MENU_DELETE, 1, "Delete page");
}
}
Deuxièmement, créer le Menu Contextuel:
public boolean onContextItemSelected(MenuItem menuItem)
{
ExpandableListContextMenuInfo info =
(ExpandableListContextMenuInfo) menuItem.getMenuInfo();
int groupPos = 0, childPos = 0;
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD)
{
groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
}
// Pull values from the array we built when we created the list
String author = mListStringArray[groupPos][0];
String page = mListStringArray[groupPos][childPos * 3 + 1];
rowId = Integer.parseInt(mListStringArray[groupPos][childPos * 3 + 3]);
switch (menuItem.getItemId())
{
case MENU_READ:
readNote(rowId);
return true;
case MENU_EDIT:
editNote(rowId);
return true;
// etc..
default:
return super.onContextItemSelected(menuItem);
}
}
C'est tout. Désormais, les utilisateurs peuvent à long appuyez sur un élément dans une liste extensible, et obtenir le menu contextuel si c'est un enfant de l'élément.