2011-02-28 65 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