Я нашел ответ в блоге Стива Оливера здесь: http://steveoliverc.wordpress.com/2009/10/16/context-menus-for-expandable-lists/
Вы должны использовать onCreateContextMenu()
вместо поиска setOnChildLongClickListener()
. Вот информация Стива:
Расширяемый список поддерживает контекстные меню почти так же, как стандартный список: добавьте прослушиватель для контекстного меню (когда пользователь долго нажимал на элемент списка). Однако, в отличие от стандартного представления списка, вы, вероятно, захотите узнать, выбрал ли пользователь групповой (расширяемый элемент) или дочерний (вложенный) элемент списка.
Кроме того, вы можете не захотеть ничего делать, если пользователь пытается вызвать контекстное меню для элемента группы. Могут быть случаи, когда вы захотите что-то сделать для всех детей в группе, но в моем приложении Librarium я хотел игнорировать элементы группы и представлять контекстное меню только для детей.
Во-первых, вам нужно знать, когда будет создано контекстное меню, чтобы вы могли определить, нажал ли пользователь на группу или на ребенка. Если они нажали на группу, то отмените контекстное меню. Это также дает нам возможность получить текст дочернего элемента, чтобы мы могли поместить его в заголовок контекстного меню.
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”);
}
}
Во-вторых, создайте контекстное меню:
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);
}
}
Вот и все. Теперь пользователи могут долго нажимать на элемент в расширяемом списке и получать контекстное меню, если это дочерний элемент.