我有一个列出SQLite表的所有行的活动。最初,当我填充表格时,点击项目将按预期打开每个项目。但是,应该修改数据库,如果删除某些行,则列表不按顺序排列(项目'SQLite _id 和列表中的位置不匹配)。有没有办法从SQLite表中检索项目的 _id 并通过意图传递它?
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent i = new Intent(MainActivity.this, FilmEditActivity.class);
Log.d(TAG, String.valueOf(id));
i.putExtra(FilmEditActivity.EXTRA_FILM_ID, position+1); //sql starts at 1; java at 0
Toast.makeText(getApplicationContext(),
"position:" + String.valueOf(position) + "; id:" + String.valueOf(id),
Toast.LENGTH_SHORT).show();
startActivityForResult(i, 0);
}
});
答案 0 :(得分:2)
如果您使用CursorAdapter
,那么传递给id
的参数onItemClick()
就是SQLite&#34; _id&#34;。
还有另一种获得&#34; _id&#34;
的方法public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Cursor cursor = (Cursor) adapter.getItem(position);
int id = cursor.getInt(cursor.getColumnIndex("_id"));
}
答案 1 :(得分:1)
我假设您使用的是CursorAdapter,这当然是从SQLite数据库填充列表的最佳方法。
要检索单击条目的主键,您可以执行以下操作:
int adapterPosition = position - listView.getHeaderViewsCount();
Cursor cursor = (Cursor) yourAdapter.getItem(adapterPosition);
int id = cursor.getInt( cursor.getColumnIndex("_id") );
将此ID传递给您的活动,您应该全部设置。
传递给onItemClick的参数id是适配器在getItemId(int)调用中返回的内容,该调用应该与数据库中的_id相同。文档说明:
获取与列表中指定位置关联的行ID。
http://developer.android.com/reference/android/widget/Adapter.html#getItemId(int)
行id不是显式主键,但可以安全地假设它们是相同的(检查CursorAdapter.getItemId(int)代码确认该假设)。
答案 2 :(得分:1)
使用id参数而不是position参数,内置类已经有助于从源数据中获取id。在实施
之后onItemCliclListener
在onItemClick函数中,使用id参数,如下面的代码所示
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// this will be executed in respective of id
Intent i = new Intent(this, ViewLyrics.class);
Bundle sendid = new Bundle();
sendid.putLong(database.KEY_ROWID, id);
i.putExtras(sendid);
startActivity(i);
}