Android 从数据库onClick ListView获取ID
我正在我的应用程序中使用SQLite。我有一个listView,其中填充了数据库中的值 当我从listview中单击一个项目时,我会转到另一个页面,我希望(出于某种目的)从数据库中传输ID。问题是我只是从我的listView的位置转移ID,这是错误的。例如,假设我有: 身份证名称 1大卫 2约瑟夫 我的listView将显示这两个名称。但是如果我删除David,当我点击Joseph时得到的ID是1而不是2。这就是问题所在 因此:当我点击一个项目时,我想从我的数据库而不是从我的列表视图中检索ID 以下是我在我的助手中的方法:更新Android 从数据库onClick ListView获取ID,android,sqlite,listview,android-studio,android-database,Android,Sqlite,Listview,Android Studio,Android Database,我正在我的应用程序中使用SQLite。我有一个listView,其中填充了数据库中的值 当我从listview中单击一个项目时,我会转到另一个页面,我希望(出于某种目的)从数据库中传输ID。问题是我只是从我的listView的位置转移ID,这是错误的。例如,假设我有: 身份证名称 1大卫 2约瑟夫 我的listView将显示这两个名称。但是如果我删除David,当我点击Joseph时得到的ID是1而不是2。这就是问题所在 因此:当我点击一个项目时,我想从我的数据库而不是从我的列表视图中检索ID
public Cursor getAllCours()
{
String Query = ("select ID as _id, nom from " + TABLE_COURS);
Open();
Cursor cursor = db.rawQuery(Query, null);
return cursor;
}
以及我如何在活动中显示它:
Cursor cursor = dbhelper.getAllCours();
String[] from = { "nom" }; int[] to = { android.R.id.text1 };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, from, to, 0);
lv.setAdapter(adapter);
最后,我的listviewClickListener:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//I THINK THE ERROR IS HERE !
long itemid= lv.getItemIdAtPosition(i);
int id= (int)itemid;
String a =lv.getItemAtPosition(i).toString();
Intent b = new Intent(AffichageCours.this,AffichageNotes.class);
Bundle args = new Bundle();
args.putString("nom_cours",a);
args.putInt("id",id);
b.putExtras(args);
startActivity(b);
}
});
}
如何使用关联菜单删除:
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch(item.getItemId())
{
case R.id.supprimer:
dbhelper.deleteCours(lv.getItemAtPosition(info.position).toString());
adapter.remove(adapter.getItem(info.position)); //the error is here..
adapter.notifyDataSetChanged();
return true;
谢谢你们 我认为问题在于,您要求的是ListView中的行Id,而不是该行保留的实际数据。在
onItemClick
方法中,更改以下内容:
long itemid= lv.getItemIdAtPosition(i);
为此:
String courId = adapter.getItem(i);
这里的关键是尝试从
ArrayAdapter
获取数据,而不是直接从ListView
获取数据。您应该使用Java对象,这样对您来说会很容易
支持您在数据库中存储联系人(包含字段:姓名、手机和地址)。为此创建一个POJO:
class Contacts{
private String name;
private String mobile;
private String address;
//write getters and setters
}
然后,每当您访问数据库时,获取所有要显示的联系人并存储在ArrayList mContactList中代码>
然后将此列表传递到ListView的适配器中,以在ListView中显示数据
CustomAdapter adapter = new CustomAdapter(context, layoutResource, mContactList);
然后,您可以根据位置单击特定列表项来检索对象
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Contacts contact = mContactList.get(i);
// now you can do whatever you want;
}
});
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
Contacts contact=mContactList.get(i);
//现在你可以做任何你想做的事;
}
});
既然您没有使用自定义适配器,为什么不在McClickListener中尝试一下呢
String idThatYouWant = listeCours.get(i).getId();
您不需要getItemIdAtPosition
:查看传递给onItemClick
方法的最后一个参数,当然,您需要使用支持db ID的正确适配器,如SimpleCorsOrAdapter
,而不是ArrayAdapter
Ok,但如何使用SimpleCorsOrAdapter执行此操作?简单如下:,它使用this.setListAdapter(mAdapter)
,您只需调用lv.setAdapter(…)相反,你没有我的问题的例子吗?喜欢密码吗?你发给我的链接有点复杂。你有6行代码,其中有什么不清楚的?表\u COURS中有哪些列?“不直接从列表视图”
您的意思是什么?从列表视图
中获取的数据是什么?列表视图如何定义所需的ID?您在ArrayAdapter中输入的确切数据是什么?My listView包含collumn名称。但是,当我单击时,我想从所选的名称传递collumn ID。但是来自数据库的ID如果您不以任何方式将ID传递给ListView或适配器,则无法获得此类ID,除非您以某种方式在列表中显示的数据和内存中的数组/数据列表之间按位置同步数据。我建议您遵循@M.Ashish的方法。将您的sql数据转储到POJO中,创建一个自定义适配器来显示数据,并通过查询适配器获取原始数据,如我在回答中所说。“无法获取此类ID”
,这就是为什么OP应该使用CursorAdapter
,文档说:“光标必须包含一个名为“\u ID”的列,否则此类将无法工作”,此\u id
列用于长游标适配器#getItemId(int position)
方法实现-查看他编辑的代码,以及现在仅使用SimpleCursorAdapter
“您应该使用Java对象”
,不,OP的数据模型是游标
,它是多么简单,所以他应该使用某种类型的CursorAdapter
,而不是ArrayAdapter
是的,他也可以这样做,但主要的一点是经常访问数据库,因为小事情不是一个好主意。这就是sqlitedb的用途,不需要在ram中复制其数据CursorAdapter
已弃用,不建议谷歌使用。我同意@M.Ashish所建议的方法。@mikehc“CursorAdapter已被弃用,不建议谷歌使用”
,从什么时候开始?你是说一个CursorAdapter
构造函数不推荐使用(但推荐另外两个)?
String idThatYouWant = listeCours.get(i).getId();