2013-09-28 98 views
2

您好我有一个从ContextMenu获取ExpandableListView项目的id的问题,我需要从我的数据库(使用内容提供者)删除条目。从ContextMenu获取ExpandableListView的选定项目

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    menu.add(Menu.NONE, MENU_EDIT, Menu.NONE, "Edit"); 
    menu.add(Menu.NONE, MENU_REMOVE, Menu.NONE, "Remove"); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuItem.getMenuInfo(); 
    switch (item.getItemId()) { 
     case MENU_EDIT: 
      editEntry(info.id); 
      return true; 
     case MENU_REMOVE: 
      deleteEntry(info.id); 
      return true; 
     default: 
      return super.onContextItemSelected(item); 
    } 
} 

private void deleteEntry(long id) { 
    Uri uri = Uri.parse(DatabaseManager.CONTENT_URI + "/" + id); 
    getActivity().getContentResolver().delete(uri, null, null); 
} 

的文本菜单正显示出,但是当我点击“删除”什么也没有发生。你能告诉我该怎么办?

+0

你没有看到从'ListView'和/或供应商删除的项目?你有没有跟踪你的提供者在触发'delete()'时发生了什么?您可能还想发布提供商的删除方法。 – Luksprog

+0

它工作得很好用的ListView – keysersoze

+0

哦,我忘了我的适配器上调用notifydatasetchanged - 该项目确实删除,但...它不是我点击的项目。当我尝试删除组中的最后一项时,它将删除组中的第一项。为什么? – keysersoze

回答

4

因为ExpandableListView有两个级别 - 组和子级 - “ID”很难直接解释。

您需要将ExpandableListContextMenuInfo中的信息分解为组位置和子位置。

使用这两个值,您可以从适配器中检索选定的项目(这里是this.exandableListAdapter),您将其用作ExpandableListView的数据源。对象适配器的getChild()回报可以转换到任何(自定义),键入您最初投入的适配器:

ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuItem.getMenuInfo(); 
int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition); 
MyItemClass item =(MyItemClass) this.expandableListAdapter.getChild(groupPos, childPos); 

从这个项目你应该很容易能够得到的ID在你的数据库或您需要的任何特定信息。

相关问题