I have 2 Fragments: Fragment_Master_List and Fragment_Trips. Master_List has an ExpandableListView
which has a context menu, this is how I implemented it:
@Override
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 groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition);
group_to_manipulate = arr_all_groups.get(groupPosition);
// Show context menu for groups
if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
menu.setHeaderTitle(group_to_manipulate.getGroup_name());
menu.add(0, Constants.Context_Menu_Items.CONTEXT_MENU_EDIT, 0, "Edit"));
menu.add(0, Constants.Context_Menu_Items.CONTEXT_MENU_DELETE, 1, "Delete"));
menu.add(0, Constants.Context_Menu_Items.CONTEXT_MENU_DELETE_ALL, 1, "Delete all"));
menu.add(0, Constants.Context_Menu_Items.CONTEXT_MENU_CLOSE, 2, "Close");
// Show context menu for children
} else if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
bi_to_manipulate = group_to_manipulate.getGroup_items().get(childPosition);
menu.setHeaderTitle(bi_to_manipulate.getItem_name());
menu.add(0, Constants.Context_Menu_Items.CONTEXT_MENU_EDIT, 0, "Edit");
menu.add(0, Constants.Context_Menu_Items.CONTEXT_MENU_DELETE, 1, "Delete");
menu.add(0, Constants.Context_Menu_Items.CONTEXT_MENU_DELETE_ALL, 1, "Delete all");
menu.add(0, Constants.Context_Menu_Items.CONTEXT_MENU_CLOSE, 2, "Close");
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
ExpandableListView.ExpandableListContextMenuInfo info
= (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition);
Group g = arr_all_groups.get(groupPosition);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
AlertDialog dialog;
if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
switch (item.getItemId())
{
case Constants.Context_Menu_Items.CONTEXT_MENU_DELETE:
//do something to delete
break;
case Constants.Context_Menu_Items.CONTEXT_MENU_DELETE_ALL:
//do something to delete all
break;
case Constants.Context_Menu_Items.CONTEXT_MENU_EDIT:
//edit code
break;
}
} else if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
Base_Item bi = g.getGroup_items().get(childPosition);
switch (item.getItemId())
{
case Constants.Context_Menu_Items.CONTEXT_MENU_DELETE:
//delete code
break;
case Constants.Context_Menu_Items.CONTEXT_MENU_DELETE_ALL:
//delete all code
break;
case Constants.Context_Menu_Items.CONTEXT_MENU_EDIT:
//edit code
break;
}
}
return super.onContextItemSelected(item);
}
So far this works. Now, in my Fragment_Trips I have a ListView
, which also has a context menu, which I implement like that:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflater = Fragment_Trips.this.getActivity().getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
trip_to_manipulate = (Trip) lv_trips.getItemAtPosition(info.position);
menu.setHeaderTitle(trip_to_manipulate.getTrip_name());
super.onCreateContextMenu(menu, v, menuInfo);
}
Once I click on a menu item - the app crashes and I'm getting the following error messages in LogCat:
07-26 20:10:36.606: E/AndroidRuntime(9967): FATAL EXCEPTION: main
07-26 20:10:36.606: E/AndroidRuntime(9967): java.lang.ClassCastException: android.widget.AdapterView$AdapterContextMenuInfo cannot be cast to android.widget.ExpandableListView$ExpandableListContextMenuInfo
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.mycompany.myapp.fragments.Fragment_Master_List.onContextItemSelected(Fragment_Master_List.java:121)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.support.v4.app.Fragment.performContextItemSelected(Fragment.java:1601)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.support.v4.app.FragmentManagerImpl.dispatchContextItemSelected(FragmentManager.java:2008)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:375)
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:3521)
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167)
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:924)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.widget.AdapterView.performItemClick(AdapterView.java:292)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.widget.AbsListView$1.run(AbsListView.java:3168)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.os.Handler.handleCallback(Handler.java:605)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.os.Handler.dispatchMessage(Handler.java:92)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.os.Looper.loop(Looper.java:137)
07-26 20:10:36.606: E/AndroidRuntime(9967): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-26 20:10:36.606: E/AndroidRuntime(9967): at java.lang.reflect.Method.invokeNative(Native Method)
07-26 20:10:36.606: E/AndroidRuntime(9967): at java.lang.reflect.Method.invoke(Method.java:511)
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-26 20:10:36.606: E/AndroidRuntime(9967): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-26 20:10:36.606: E/AndroidRuntime(9967): at dalvik.system.NativeStart.main(Native Method)
Line 121 is this one:
ExpandableListView.ExpandableListContextMenuInfo info
= (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
and it's in Fragment_Master_List, not even in Fragment_Trips...
Why is it happening and how do I fix it?