Java 在Android中单击列表项时获取主ID

Java 在Android中单击列表项时获取主ID,java,android,sqlite,listview,Java,Android,Sqlite,Listview,我正在尝试为密码管理器创建一个列表视图,它将用数据库中的项目填充一个列表视图,当有人单击它时,它将返回primaryid。。。。我见过其他的例子,但不能正确地完成。。。。以下是我到目前为止所做的。。。。我能够填充列表视图,但无法处理点击事件:( ArrayList listItems=new ArrayList(); ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u single\u choice,list

我正在尝试为密码管理器创建一个列表视图,它将用数据库中的项目填充一个列表视图,当有人单击它时,它将返回primaryid。。。。我见过其他的例子,但不能正确地完成。。。。以下是我到目前为止所做的。。。。我能够填充列表视图,但无法处理点击事件:(

ArrayList listItems=new ArrayList();
ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u single\u choice,listItems);
SQLiteDatabase DB=null;
最终字符串TableName=“XIBEAT\u密码”;
字符串DBname=“Xibeat\u Crypto\u Knight\u Vault”;
试一试{
DB=this.openOrCreateDatabase(DBname,MODE_PRIVATE,null);
DB.execSQL(“创建表,如果不存在”+TableName+”(“\u id”整数主键自动递增、主机文本、URL文本、密码文本、注释文本、标记文本、时间文本、日期文本、过期文本、编辑文本、强度文本、原因文本);”;
游标c=DB.rawQuery(“选择*自”+表名,空);
int host=c.getColumnIndex(“主机”);
字符串标题=”;
c、 moveToFirst();
如果(c!=null)
{
while(c.moveToNext()){
title=c.getString(主机);
//祝酒词(标题);
添加(标题);
}
}  
最终ListView passList=(ListView)findViewById(R.id.passList);
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,listItems));
//======================单击侦听器+=========
setOnItemClickListener(新的OnItemClickListener()
{public void onItemClick(AdapterView arg0、视图arg1、int arg2、long arg3){
}});            
}最后{
如果(DB!=null)
DB.close();
}
}

使用自定义列表适配器将Id(getColumnIndex(“_Id”))保存在自定义对象中,而不是让Android为您创建简单视图。

如果您从
光标读取数据,则应使用一个或其子类之一,例如代替
ArrayAdapter

Cursor c = DB.rawQuery("SELECT * FROM " + TableName , null);
final ListView passList=(ListView)findViewById(R.id.passlist);
passList.setAdapter(new SimpleCursorAdapter(this, // Context
    android.R.layout.simple_list_item_1, // Layout
    c, // Your Cursor
    new String[] { "HOST" }, // Column(s) you want to display
    new int[] { android.R.id.text1 }),
    0); // Flags, 0 -> don't auto-requery when the data changes
其完整签名为:

onItemClick(AdapterView父对象、视图、整型位置、长id)


如果使用
CursorAdapter
,则最后一个参数
id
是数据库中的
\u id
列。

使用ArrayAdapter从数据库加载不是一个好主意。您应该使用CursorAdapter和CursorLoader来管理数据库。不推荐使用SimpleCorsorAdapter

以下是有关自定义游标适配器的良好教程:


另一个是给游标装入器的:

非常感谢,伙计……我欠你的:)做了一半。。。我可以在我的SQLite数据库中找到这个职位:)快速提问。。。由于我的_id是一个自动增量,它会返回相同的_id吗?例如:如果有三个项目,我从数据库中删除了第二行。。。然后我从行中选择最后一个元素。。。。我会得到3个或2个自动增量列的ID吗?不要重复使用已删除的ID,所以C将继续得到3个(如果插入D,它将得到4个ID,等等)。。。它和弗罗约一起在银河系S上工作。。。但Nexus7无法使用jellybean,因为它已被弃用。。。。你能给我推荐一种使用CursorLoader的方法吗:(@user2937922-CursorLoader将是一个更大的转换-你可以使用非弃用的构造函数来添加一个“flag”参数(你可以使用
0
for)-我已经更新了我的答案。谢谢你的回复,但我已经尝试过了…当我将标志设置为0时,应用程序在4.3中崩溃…尝试谷歌…使用加载程序完成:(
Cursor c = DB.rawQuery("SELECT * FROM " + TableName , null);
final ListView passList=(ListView)findViewById(R.id.passlist);
passList.setAdapter(new SimpleCursorAdapter(this, // Context
    android.R.layout.simple_list_item_1, // Layout
    c, // Your Cursor
    new String[] { "HOST" }, // Column(s) you want to display
    new int[] { android.R.id.text1 }),
    0); // Flags, 0 -> don't auto-requery when the data changes