我无法解决这个问题,我浏览了许多帖子,但我实在感到非常绝望,因为我必须在第二天之前完成此操作。 问题如下:
我有一个listView包含来自数据库的条目。 可以长按它们以调用contextMenu。 在上下文菜单中,我可以删除或编辑条目,为此,我需要所选项目的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);
}
}
现在我的问题是,我从信息中获取的ID始终为0。这真的很奇怪,因为在更改布局之前它已经起作用了,我在同一屏幕的2个选项卡中运行了相同的活动。 这可能是原因吗?
item.getItemId()返回错误的值吗?或item.id?检查此链接配合stackoverflow.com/questions/2453620/
无论我选择哪个条目,info.id()都将返回0。
你能显示你的R.menu.edit_grade_menu布局吗
尝试在onCreateContextMenu()中添加两行menu.add(0,0,0," Edit Grade"); menu.add(0,1,1,"编辑成绩");并查看是否可以使用OR menu.add(0,v.getId(),0," Edit Grade"); menu.add(0,v.getId(),0,"编辑成绩");
inflater2.inflate(R.menu.edit_grade_menu, menu); menu.add(0, 0, 0,"Edit Grade"); menu.add(0, 1, 1,"Delete Grade");我尝试了此操作,但是当我登录与menu.add(0, v.getId(), 0,"Edit Grade"); menu.add(0, v.getId(), 0,"Edit Grade");相同的info.id时仍然得到0
这是有关ContextMenu创建的一个很好的例子secretthcopter.com/blog/2010/04/
那info.position呢?
这是你的答案人-stackoverflow.com/questions/6208738/adaptercontextmenuinfo-id
那真的没有帮助,因为我的问题是我无法从被"长按"的元素中读取ID,而我确实需要此ID,因为我必须在下一个屏幕上从数据库中获取数据。
好,上下文菜单是长按,而您依赖位置而不是ID以及它的书写方式,即使用CursorAdapter时,它是Cursor内部的_id列的值。因此,基本上,您在填充可单击ListView时将需要使用CursorAdapter。也许您使用其他东西。
非常感谢,我发现了错误,问题出在我的数据库中,不知何故主键字段不再自动递增,所有条目的ID为0 ...我应该早些猜到了,但是令人困惑,因为昨天工作正常...反正谢谢:)
我有同样的问题。 它不是在实现ListView的上下文菜单/类中发生,而是在创建数据库表_id列期间发生。 使用此语法时:
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
和
_id INTEGER PRIMARY KEY AUTOINCREMENT
第二个作品,第一个没有。 很难调试的是,两者在语法上都是正确的。
另一个重要的事情是,在再次运行应用程序之前,需要通过adb终端从应用程序中删除数据库对象,因为扩展SQLiteOpenHelper的类的onCreate方法不会在数据库已经存在的情况下触发-仅在数据库不存在时才触发 't,因此在更正后删除数据库,然后重新运行该应用程序很重要。
希望对您有所帮助。