Android 从数据库onClick ListView获取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

我正在我的应用程序中使用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(…)“不直接从列表视图”
您的意思是什么?从
列表视图
中获取的数据是什么?列表视图如何定义所需的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();