Java 上下文菜单中所选项目的id始终为0

Java 上下文菜单中所选项目的id始终为0,java,android,database,eclipse,contextmenu,Java,Android,Database,Eclipse,Contextmenu,我不能让这个工作,我已经看了很多帖子,我真的很绝望,因为我必须完成这个直到后天。问题如下: 我有一个包含数据库条目的列表视图。可以长时间单击它们以调用上下文菜单。在上下文菜单中,我可以删除或编辑条目,为此,我需要所选项目的id @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.

我不能让这个工作,我已经看了很多帖子,我真的很绝望,因为我必须完成这个直到后天。问题如下:

我有一个包含数据库条目的列表视图。可以长时间单击它们以调用上下文菜单。在上下文菜单中,我可以删除或编辑条目,为此,我需要所选项目的id

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);
  MenuInflater inflater2 = getMenuInflater();
  inflater2.inflate(R.menu.edit_grade_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
  AdapterContextMenuInfo info =  (AdapterContextMenuInfo) item.getMenuInfo();
  int id = (int) info.id;
  switch (item.getItemId()) {
  case R.id.edit_grade:
    Intent i = new Intent(this, AddGradeActivity.class);
    i.putExtra(GradesDbAdapter.KEY_ROWID, linkSubject);

    // putExtra edit, so addGradeActivity knows it has to fill views with values to edit grade
    i.putExtra("edit", true);
    i.putExtra(GradesDbAdapter.KEY_GRADE, id);
    this.startActivity(i);
    finish();

    return true;
  case R.id.del_grade:
      myDbHelper.deleteGradeEntry(id, semester);
      // filldata to refresh listview
      fillData();
    return true;
  default:
    return super.onContextItemSelected(item);
  }
}

现在我的问题是,我从info获得的id总是0。这真的很奇怪,因为它在我更改布局之前就已经运行了,我在同一屏幕上的两个选项卡中运行了相同的活动。这可能是原因吗?

我也有同样的问题。它不是在实现ListView的上下文菜单/类中发生的,而是在创建数据库表时发生的。使用此语法时:

db.execSQL("CREATE TABLE TABLE_NAME(_id INTEGER AUTO INCREMENT PRIMARY KEY,  TITLE TEXT, VALUE REAL);");
AdapterView.AdapterContextMenuInfo.id
始终返回
0

但是,如果使用此语法:

db.execSQL("CREATE TABLE TABLE_NAME(_id INTEGER PRIMARY KEY AUTOINCREMENT,  TITLE TEXT, VALUE REAL);");
AdapterView.AdapterContextMenuInfo.id
始终返回正确的id

因此,两者之间存在差异:

_id INTEGER AUTO INCREMENT PRIMARY KEY 

第二行,第一行不行。使调试变得困难的是两者在语法上都是正确的

另一件重要的事情是,在再次运行应用程序之前,需要通过adb终端从应用程序中删除数据库对象,因为扩展
SQLiteOpenHelper
的类的
onCreate
方法不会在数据库已经存在的情况下触发-仅在数据库不存在的情况下才会触发,因此,重要的是在进行更正后删除数据库,然后重新运行应用程序


我希望这会有所帮助。

item.getItemId()是否返回了错误的值?还是项目id?选中此链接。无论我选择哪个条目,info.id()都返回0。请显示您的R.menu.edit_grade_菜单布局
尝试添加onCreateContextMenu()两行菜单。添加(0,0,0,“编辑等级”);菜单。添加(0,1,1,“编辑等级”);并查看它是否工作或菜单。添加(0,v.getId(),0,“编辑等级”);添加(0,v.getId(),0,“编辑等级”);
_id INTEGER PRIMARY KEY AUTOINCREMENT