1

データベースの文字列列から作成されたリスト メニューがあります。ユーザーがリスト メニュー項目をクリックすると、それが削除されます。リスト項目の位置を DBAdapter の削除関数に渡すことでこれを行っています。

protected void onListItemClick(ListView l, View v, int position, long id) {
  super.onListItemClick(l, v, position, id);
  db.deleteContact(position);
  }

この関数は、対応する行インデックスを見つけて削除します。

public boolean deleteContact(long rowId) {
  return db.delete(DATABASE_TABLE, KEY_NAME + "=" + rowId, null) > 0;
  }

問題 (おそらくほとんどの人にとって非常に明白です) は、ユーザーがリスト メニュー項目 2 を削除すると、対応するインデックスがテーブルから削除されると、リスト メニューが更新され、以前は位置 3 にあった項目が現在ユーザーがそれを削除しようとすると、削除関数はパラメーターとして「2」を受け取りますが、削除する行のインデックスは 3 です。

これはばかげた問題であることはわかっていますが、誰かが効果的な回避策を提案できますか? ありがとう

4

1 に答える 1

2

位置ごとに削除しないでください。idメソッドで提供されている は、あなたonListClickItemを助けるためにここにあります。上記のコードを次のように置き換えます。

protected void onListItemClick(ListView l, View v, int position, long id) {
  super.onListItemClick(l, v, position, id);
  db.deleteContact(id);
  }

yourKEY_NAMEがテーブルの主キーである場合。KEY_NAMEそうでない場合は、主キー フィールドの名前に置き換えます。

于 2012-11-14T03:08:54.743 に答える