2011-05-27 92 views
36

我是Android開發的新品...來自iPhone和.Net背景。我看到這個問題非常類似,但他們都沒有處理SimpleCursorAdapter。從ListView中獲取與SimpleCursorAdapter綁定的選定項目

我有使用遊標從一個SQLite查詢我的ListView綁定數據提供了基本ListActivity:

ListAdapter adapter = new SimpleCursorAdapter(
     this, 
     android.R.layout.simple_list_item_1, 
     c,   
     new String[] {"name"}, 
     new int[] {android.R.id.text1}); 

setListAdapter(adapter); 

然後單擊項目時:

public void onListItemClick(ListView l, View v, int position, long id) { 

    super.onListItemClick(l, v, position, id); 

    //Difference between this: 
    Cursor c = (cursor)l.getItemAtPosition(position); 
    //and this?? 
    Cursor c = (Cursor)l.getAdapter().getItem(position); 

    int categoryId = c.getInt(0); 
} 

這是正確的方式獲取所選元素的ID?這似乎很奇怪,因爲我不認爲我可以在數據庫關閉後使用我的遊標(這是綁定後)。當我似乎無法找到從該ID獲取實際項目的方式時,傳入的ID的點是什麼?另外,我不明白爲什麼getItemAtPosition()會返回一個遊標......遊標綁定到整個列表;不只是一排。最後,如果這是正確的,那麼獲得光標的兩種方式之間是否存在差異?謝謝。

回答

81

所以有幾點:在取出遊標後,你想打電話給startManagingCursor。這將遊標的生命週期與Activity的生命週期聯繫在一起(所以當Activity被破壞時,遊標被關閉/清理)。

startManagingCursor(c); 
ListAdapter adapter = new SimpleCursorAdapter(
     this, 
     android.R.layout.simple_list_item_1, 
     c,   
     new String[] {"name"}, 
     new int[] {android.R.id.text1}); 
setListAdapter(adapter); 

此外,數據庫不關閉,光標通常保持對DB(所以ListView控件可以滾動做這種性質,可能需要未來光標的內容訪問的事物的實時連接。

要在覈心問題,做到在onListItemClick最簡單的方法是這樣的:

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor(); 
c.moveToPosition(position); 

然後,您可以使用c.getLong(0)獲得ID(假設你獲取的ID列這是通常情況下的第一列)。但是,請注意,id是作爲簽名的一部分傳入的(請參閱public void onListItemClick(ListView l, View v, int position, long id)中的最後一個參數),因此您實際上不需要再次獲取它(但如果要刻錄循環,則當然可以)。爲了訪問其他列,你可以做同樣的事情,只需要改變列索引。

希望有所幫助。

+0

謝謝!我打電話給startManagingCursor,但我不明白爲什麼到現在爲止!幾個問題...所以即使我調用SQLiteDatabase.close(),這不會停止我的光標訪問它?而ListView似乎沒有getCursor()方法。最後,傳遞給我的方法的ID是自動從我的數據庫的ID?謝謝! – GendoIkari 2011-05-27 19:51:42

+1

啊,如果你調用'close',那麼你的ListView可能會停止工作:通常我所做的就是重用我的Application對象作爲我的數據庫適配器:調用在'onCreate'中打開並在'onTerminate'中關閉,然後使用它數據庫連接生命週期到應用程序的生命週期。至於'getCursor',我的錯誤:它應該是'Cursor c =((SimpleCursorAdapter)l.getAdapter())。getCursor();'。是的,ID是數據庫中出來的:它非常方便。 – Femi 2011-05-27 20:12:22

+0

再次感謝您的幫助! – GendoIkari 2011-05-27 20:16:30

0

另一種方式:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) { 

      Cursor cursor = (Cursor) parent.getAdapter().getItem(position); 
      //TODO 
      } 
}); 
相關問題