如何从ListView中的SQLiteDB获取RowID?

时间:2011-02-28 22:07:09

标签: android

我有一个由SQLiteDB提供的ListView。在返回的每一行上,我有一个可点击的TextView,onClick应删除该行上的项目。所以我需要找到sql rowid,所以我可以调用deleteItem(rowid)。

我已经尝试输入一个不可见的TextView,当我填充ListView时,我用sql rowid填充它,它可以工作。但是我将内容视图设置为R.layout.list_view,而不可见的TextView位于R.layout.list_item(每个项目行的自定义布局),所以我似乎无法访问它。

我如何开展这项工作或有更好的方法?

以下是填充listview的代码:

    private void fillData() {
    // Get all of the notes from the database and create the item list
    Cursor c = mDbHelper.fetchAllNotes();
    startManagingCursor(c);

    String[] from = new String[] { CommonDbAdapter.KEY_NOTES };
    int[] to = new int[] { R.id.text1 };

    // Now create an array adapter and set it to display using our row
    SimpleCursorAdapter notes =
        new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
    setListAdapter(notes);
}

这是我当前的点击监听器,我不知道如何区分项目上的点击,将项目返回到另一个活动,以及单击将删除项目的textview。

    itemList = (ListView) findViewById(android.R.id.list);
    itemList.setTextFilterEnabled(true);
    itemList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
            Intent intent = new Intent();
            Bundle b = new Bundle();
            b.putString("TEXT", ((TextView)v.findViewById(R.id.text1)).getText().toString());
            intent.putExtras(b);
            setResult(SUCCESS_RETURN_CODE, intent);
            finish();
        }
    });

我原本试图获取rowid并在布局中使用简单的onClick设置。但是遇到了这个问题。

public void clickDelete(View view) {
    mDbHelper.deleteNote(rowid);
}

2 个答案:

答案 0 :(得分:1)

这是一种快速获取文本视图点击监听器的方法:

替换你的行:

SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);

用这个:

setListAdapter(new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = super.getView(position, convertView, parent);

    final TextView t = (TextView)v.findViewById(R.id.text1);
    t.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "Hello " + t.hashCode(), Toast.LENGTH_SHORT).show();
        }
    });

    return v;
}
});

现在,您的text1视图将有一个onclick监听器,您可以随心所欲。您需要将rowId存储在onClick方法内可访问的地方。

这并不完全回答我猜的问题,但是它为列表视图中的单个视图提供了一个点击监听器。

你真的应该实现一个自定义的CursorAdapter类来执行这样的操作,尽管你可以从某个地方乱砍并检索rowId

或者您可以使用不可见的textview并向其添加onclick侦听器(如上所示),抓取它的值(这是一个rowId),然后执行操作。

答案 1 :(得分:0)

您使用的是CursorAdapter吗?如果是这样,您可以直接查询Cursor的rowid。

您可能希望使用OnItemClickListener而不是OnClickListener。这将为您设置ListView,位置和ID。我相信如果你使用的是CursorAdapter,那么给你的id就是数据库中行的实际rowid。

修改:如果无法使用OnItemClickListener,您必须从CursorAdapter更改为SimpleCursorAdapter才能执行此操作。在bindView方法中,您可以访问要创建的View的rowid,并且可以在您创建的OnClickListener中引用它。