2011-02-28 34 views
1

我有一个由SQLiteDB提供的ListView。在返回的每一行上,我都有一个可单击的TextView,onClick应删除该行上的项目。所以我需要找到sql rowid,所以我可以调用deleteItem(rowid)。如何从ListView中的SQLiteDB获取RowID?

我已经试过把一个看不见的TextView填充到sql rowid当ListView被填充,它的工作原理。但是我将内容视图设置为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); 
} 

这是我目前的点击收听,我不知道如何在项目,它返回该项目以另一个活动点击区分和点击将删除该项目的文本视图。

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集。但有问题得到rowid。

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

你似乎正在过度如何做到这一点我想..向我们展示填充listview和你的listview适配器的代码。它会更容易告诉你你应该改变什么 – binnyb 2011-02-28 22:18:34

回答

1

这里是一个快速的方式来获得一个点击监听器只是你的TextView:

取代你的台词:

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),并执行一个操作。

+0

好吧,所以我用你的ClickListener来处理“删除”文本视图。我将rowid存储在一个不可见的textview中。 onClick,我打电话给deleteNote ...那有效。然后,我也在上面发布的onCreate中有listview ItemClickListener,它处理选择项目......可以工作。所以我有一个listview ItemClickListener和一个ClickListener的视图,它是在一个已经有一个ItemClickListener的列表视图中的...它可以工作,但是这样可以吗? – Roger 2011-02-28 23:36:38

+0

如果有效,确定没关系。如果需要添加更多功能,您需要在某个时候创建​​自定义适配器 – binnyb 2011-03-01 14:09:02

0

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

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

编辑:如果使用OnItemClickListener是不可能的,你必须从SimpleCursorAdapterCursorAdapter更改为做到这一点。在你的bindView方法中,你可以访问你创建的视图的rowid,你可以在你创建的OnClickListener中引用它。

+0

是的,我正在使用SimpleCursorAdapter。 – Roger 2011-02-28 22:26:07

+0

如果我使用OnItemClickListener,我该如何区分是否点击项目的文本视图或删除项目的文本视图? 我已经有一个OnItemClickListener,它将单击的项目返回到另一个活动的字段。 – Roger 2011-02-28 22:27:33

+1

我建议使用自定义适配器而不是'SimpleCursorAdapter' ...这样你可以更容易地定义视图的'onClick'方法和'tag' – binnyb 2011-02-28 22:31:12