ListView пуст, если SimpleCursorAdapter закрыт ()

У меня проблема с пониманием того, почему мой ListActivity и соответствующий ему listView пусты, когда я вызываю метод close () для объекта cursor?

Позвольте мне немного объяснить ...

Я беру некоторые значения из БД и получаю результат в своем объекте курсора. После этого я создаю свой SimpleCursorAdapter и связываю столбец из базы данных с полем в моем listView.

Работает как шарм, но ...

Если я вызываю cursor.close () в конце метода onCreate (), мой listView отображается пустым?

Если я регистрирую значения от курсора до LogCat, они остаются там до вызова cursor.close (), и это имеет смысл, но почему listAdapter очищается, когда cursor.close () называется ??? Я ожидал бы, что ListAdapter listAdapter = new SimpleCursorAdapter (...) будет хранить значения, которые «привязаны» к listView, пока наша активность не будет уничтожена ...

Почему это так? Когда и зачем нужно закрывать курсор?

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 OO, и там, если вы определяете переменную-член, вы должны работать с ней в методах объекта, используя синтаксис $ this-> cursor . Я заметил, что в Android / Java мне не нужно использовать this.cursor.getCount (), чтобы получить от него ссылку / значение. Достаточно сказать cursor.getCount () Почему это разрешено?


person luigi7up    schedule 26.10.2011    source источник


Ответы (2)


Почему это так?

Adapter требуются данные из предоставленного Cursor и подготовьте ListView соответственно, и когда вы вызываете cursor.close(), Cursor освобождается и становится недействительным. (означает, что данных нет.)

Когда и зачем нужно закрывать курсор?

Необходимо закрыть Cursor, пока вы собираетесь покинуть Activity и возвращаться из Activity, иначе Cursor просочится из-за этого Activity.

Достаточно сказать cursor.getCount () Почему это разрешено?

Структура Java основана на классах. Каждое действие выполняется в рамках определенного класса. Даже для повторения «одной строки» потребуется класс. а когда вы находитесь в классе, вы можете обращаться к членам класса с помощью this ИЛИ с указанием их переменных

person Adil Soomro    schedule 26.10.2011

Вы не должны закрывать курсор, пока ваша Activity не будет уничтожена (т.е. в onDestroy()), потому что реализация CursorAdapter ожидает, что он будет открыт, чтобы иметь возможность запрашивать и фильтровать его.

Поскольку вы все равно вызываете startManagingCursor, ваше Activity автоматически деактивирует, запрашивает и закрывает курсор при соответствующих событиях жизненного цикла Activity, поэтому нет необходимости закрывать его самостоятельно.

person Jeff Gilfelt    schedule 26.10.2011