2011-10-26 42 views
4

我理解爲什麼我的ListActivity和其相應的的ListView空當我打電話的close()方法光標對象有問題嗎?ListView的空當SimpleCursorAdapter關閉()

讓我解釋一下我自己有點...

我retreive從DB一些價值觀和得到的結果在我的光標對象。之後,我創建了我的SimpleCursorAdapter,並將數據庫中的列與我的listView中的字段綁定。

得好好的,但是......

如果我打電話cursor.close()的onCreate()方法我的ListView的末尾顯示是空的?

如果我登錄從光標到logcat的他們在那裏的值,直到調用cursor.close()和非常有意義,但爲什麼當cursor.close()被稱爲listAdapter清空? ? 我希望ListAdapter listAdapter =新SimpleCursorAdapter(...)持有被「綁定」到的ListView直到我們activity被銷燬值...

爲什麼會這樣呢?何時以及爲什麼需要關閉光標?

public class ListTrainingsView extends ListActivity{ 
private SQLiteDatabase db; 
private ListAdapter listAdapter; 
private Cursor cursor; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_trainings); 

    DatabaseHelper helper = new DatabaseHelper(this); 

    this.db = helper.getWritableDatabase(); 

    this.cursor = db.query("trainings", fields, null, null, null, null, null); 

    startManagingCursor(cursor); 

    this.listAdapter = new SimpleCursorAdapter(this, 
      R.layout.list_trainings_item, 
      cursor, 
      new String[] {"name"}, 
      new int[] { R.id.name_entry} 
    ); 

    this.setListAdapter(this.listAdapter); 

//If I call 
//cursor.close(); 
//shown list is empty 

另一個問題是更基本的Java語言類型的問題......我來自PHP的面向對象的背景和那裏,如果你定義的成員變量必須使用語法$這個 - 對象方法與它合作>光標。我注意到,在Android/Java中,我不必使用this.cursor.getCount()以從中獲取參考/值。這足以說明cursor.getCount()這是怎麼來的?

回答

1

這是爲什麼?從

Adapter需求數據提供Cursor和相應的準備ListView,當你調用cursor.close()Cursor被釋放和無效。 (表示沒有數據)

何時以及爲什麼需要關閉光標?

,而你將要離開,有必要關閉CursorActivity並打算從Activity否則Cursor得到了泄露爲Activity回來。

這足以說cursor.getCount()如何走到這是允許的?

Java的結構是基於類。每個動作都是在一個特定的類中完成的。即使回顯「單行」也需要一個類。當你在一個類,你可以訪問類成員this直接的變量

2

你不應該關閉你的遊標,因爲你的Activity被銷燬(即在onDestroy()),因爲CursorAdapter的實現期望它被打開以便能夠重新查詢和過濾它。

因爲無論如何您都會調用startManagingCursor,您的Activity將自動停用,重新查詢並關閉相應的Activity生命週期事件,因此無需自行關閉它。

相關問題