从数据库onClick ListView获取ID

时间:2017-04-17 08:47:23

标签: android sqlite listview android-studio android-database

我在我的应用中使用SQLite。我有一个listView,其中填充了数据库中的值。

当我点击列表视图中的某个项目时,我会转到另一个页面,我希望(有意图)从ID DATABASE传输ID。问题是我只是从listView的位置传输ID,这是错误的。例如,假设我有:

ID名称 1大卫 2约瑟夫

我的listView将显示两个名称。但如果我删除大卫,我点击约瑟夫时得到的ID是1而不是2。那就是问题!

所以:我想从我的数据库中检索ID,而不是在点击某个项目时从我的listView中检索

这是我帮手中的方法:UPDATED!

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

    });
}

我的TABLE_COURS列:

 private static final String TABLE_COURS = "cours";
private static final String COLONNE_IDCOURS = "ID";
private static final String COLONNE_COURS = "nom";

 private static final String CREATE_COURS ="CREATE TABLE cours " +
        "("+COLONNE_IDCOURS+" INTEGER PRIMARY KEY AUTOINCREMENT , "
        +COLONNE_COURS+" TEXT NOT NULL)";

我如何删除我的上下文菜单:

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

谢谢你们!

3 个答案:

答案 0 :(得分:0)

我认为问题在于你要求ListView中行的Id而不是该行所持有的实际数据。在onItemClick方法中更改此内容:

long itemid= lv.getItemIdAtPosition(i);

为此:

String courId = adapter.getItem(i);

此处的关键是尝试从ArrayAdapter直接从ListView获取数据。

答案 1 :(得分:0)

您应该使用Java对象,这样对您来说很容易。

支持您在dataBase中存储了联系人(包含字段:名称,移动和地址)。所以为此创建一个POJO:

class Contacts{
    private String name;
    private String mobile;
    private String address;

    //write getters and setters
}

然后,无论何时访问数据库,都要获取要显示并存储在ArrayList<Contacts> 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;
        }

    });

答案 2 :(得分:0)

由于您没有使用自定义适配器,为什么不在onItemClickListener中尝试这个

String idThatYouWant = listeCours.get(i).getId();