Идентификатор выбранного элемента из contextMenu всегда равен 0 - PullRequest
0 голосов
/ 18 января 2012

Я не могу заставить это работать, я просмотрел много постов, и я действительно в отчаянии, так как я должен закончить это до послезавтра.Проблема заключается в следующем:

У меня есть listView с записями из базы данных.Можно сделать длинный щелчок по ним, чтобы вызвать contextMenu.В контекстном меню я могу либо удалить, либо отредактировать запись, и для этого мне нужен идентификатор выбранного элемента.

@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);
  }
}

Теперь моя проблема в том, что этот идентификатор, который я получаю из информации, всегда равен 0. Это действительно странно, так как оно работало до того, как я изменил макет, у меня та же самая операция выполняется в 2 вкладках на одной и той жеэкран.Может ли это быть причиной?

1 Ответ

2 голосов
/ 26 ноября 2015

У меня была такая же проблема.Это произошло не в контекстном меню / классе, в котором реализован 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 INTEGER AUTO INCREMENT PRIMARY KEY 

и

_id INTEGER PRIMARY KEY AUTOINCREMENT

секунда работает, первая нет.Что затрудняет отладку, так это то, что оба синтаксически верны.

Еще одним важным моментом является необходимость удаления объекта базы данных из приложения через терминал adb перед повторным запуском приложения, поскольку метод onCreate класса, который расширяет SQLiteOpenHelper, не запускается, если база данных уже существует -он срабатывает только в том случае, если этого не происходит, поэтому важно удалить базу данных после внесения исправлений, а затем повторно запустить приложение.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...