listview.setOnItemClickListener可以将SQLite _id传递给它的意图而不是位置吗?

时间:2014-10-24 02:02:27

标签: android sqlite listview android-intent android-listview

我有一个列出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);
        }
    });

3 个答案:

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