我创建了一个列表视图,显示存储在SQLite数据库中的项目的名称和日期,现在我想使用上下文菜单修改存储在数据库中的这些项目,例如编辑名称,删除和查看。
这是列表视图的代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
SQLiteDatabase myDB = null;
myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
Cursor cur = myDB.rawQuery("SELECT _id, trackname, tracktime" + " FROM " + MY_DB_TABLE, null);
ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.listview, cur,
new String[] { Constants.TRACK_NAME, Constants.TRACK_TIME}, new int[] { R.id.text1, R.id.text2});
ListView list = (ListView)findViewById(R.id.list);
list.setAdapter(adapter);
registerForContextMenu(list);
}
和上下文菜单......
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Track Options");
menu.add(0, CHANGE_NAME, 0, "Change name");
menu.add(0, VIEW_TRACK, 0, "View track");
menu.add(0, SEND_TRACK, 0, "Send track");
menu.add(0, DELETE_TRACK, 0, "Delete track");
}
我使用了Switch语句控制菜单项..
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()){
case CHANGE_NAME:
changename();
return true;
case DELETE_TRACK:
deletetrack();
return true;
default:
return super.onContextItemSelected(item);
}
那么我将如何继续映射deletetrack();找到存储在数据库中的轨道的ID到列表视图中选择的项目的方法?
答案 0 :(得分:3)
在您的onContextItemSelected()
中,执行以下操作:
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
Track track = (Track)mAdapter.getItem(info.position);
键是“position”,它将为您提供所选项目的索引。
答案 1 :(得分:1)
我试过这种方法和许多其他方法,但没有一个对我有用。 这就是我最终得到它的方式:
1。我在我的数据库处理程序类(扩展SQLiteOpenHelper的类)中创建了一个方法,该方法检索数据库中的所有ID:
public ArrayList<HashMap<String, String>> selectAllIds() {
try {
ArrayList<HashMap<String, String>> idArrayList = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map;
SQLiteDatabase database = this.getReadableDatabase();
String query = "SELECT * FROM " + DEBTS_TABLE_NAME;
Cursor cursor = database.rawQuery(query, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
do {
map = new HashMap<String, String>();
map.put("id", cursor.getString(0));
idArrayList.add(map);
} while (cursor.moveToNext());
}
}
if (cursor != null) {
cursor.close();
}
database.close();
return idArrayList;
} catch (Exception e) {
return null;
}
}
2。在具有onContextItemSelected
方法的类或片段中,声明:
ArrayList<HashMap<String, String>> myIds;
3。然后在我的onContextItemSelected
方法中:
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
myIds = debtDatabaseHandler.selectAllIds();
int id = Integer.parseInt(myIds.get(info.position).get("id"));
我的数据库中的id是Integer
类型的,这就是我必须解析它的原因。如果你的id是一个字符串,那就做:
String id = myIds.get(info.position).get("id");
4. 最后,将此ID传递给调用以删除数据库中的行:
yourDatabase.deleteMethod(id);
理念信用: Android Delete Rows Data in SQLite Database (Android SQLite)
答案 2 :(得分:0)
我无法在@synic的答案中添加评论,但它对我来说完全有效。下面的代码可以获取Listview的项目:
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo)aItem.getMenuInfo();
然后你可以对项目做你想做的事情,比如getId(),getName(),getDate()等等。祝你高兴。