Использование SimpleCursorAdapter + Sqlite, похоже, не работает с ListActivity. - PullRequest
0 голосов
/ 28 октября 2011

Я только начал создавать очень простой экран оценки для своего приложения, но, похоже, ничего не происходит, и я не могу понять, почему.

ListActivity:

public class HighScoresActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.high_scores);

        ScoresDatabase db = new ScoresDatabase(this);
        Cursor data = db.getHighScores();

        ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, data, new String[] { "level" }, new int[] { R.id.level_text });
        setListAdapter(adapter);

        data.close();
        db.close();
    }
}

high_scores.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

    <TextView 
        android:text="Text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/level_text"/>

    <ListView 
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>

</LinearLayout>

Нет никаких сообщений об ошибках, просто ничего не происходит. Не то, чтобы курсор также был пустым, когда я тестирую метод adapter.getCount (), он возвращает ~ 30, что в точности так, как и ожидалось.

Я думаю, что все имена функций интуитивно понятны, но если вам нужны какие-либо пояснения, просто спросите.

Любая помощь очень ценится

Ответы [ 4 ]

1 голос
/ 28 октября 2011
data.close(); // DON'T DO THIS

Из документов для Cursor.close () ...

Закрывает Курсор, высвобождая все его ресурсы и делая его полностью недействительным. В отличие от deactivate () вызов метода Requery () не сделает курсор снова действительным.

Adapter для ListView должен иметь 'live' Cursor, иначе он не будет работать. Кроме того, закрытие базы данных не всегда хорошо и может иметь неблагоприятные последствия в некоторых случаях (по моему опыту), хотя я не уверен, что это также может вызвать проблемы.

РЕДАКТИРОВАТЬ: В свете комментария Дейва Ньютона и проверки некоторых из моего собственного кода, проблема будет с вызовом close() как для Cursor, так и для базы данных. Короче уберите следующие строки ...

data.close();
db.close();
0 голосов
/ 28 октября 2011

Было 2 проблемы с моим первым кодом.

Первая, как указал MisterSquonk, преждевременно закрывает курсор и базу данных.

Вторая была в правильной привязке данных кviews.

Вот код моего теперь работающего решения

HighScoresActivity:

public class HighScoresActivity extends ListActivity {

    private Cursor data;
    private ScoresDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.high_scores);

        db = new ScoresDatabase(this);
        data = db.getHighScores();

        ListAdapter adapter = new SimpleCursorAdapter(
                this, 
                R.layout.high_scores_entry, data, 
                new String[] { "level", "moves" }, 
                new int[] { R.id.level_entry, 
                R.id.moves_entry });

        setListAdapter(adapter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        data.close();
        db.close();
    }
} 

high_scores.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >
    <ListView
        android:id="@android:id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

high_scores_entry.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    <TextView
        android:id="@+id/level_entry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/moves_entry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

То, как я изначально связал данные, не имело смысла.

0 голосов
/ 28 октября 2011

Последний параметр в SimpleCursorAdapter ctor должен быть идентификатором поля макета списка, android.R.id.text1.

R.id.level_text - это идентификатор текстового поля, которое вы используете в качестве заголовка;его текст должен быть задан из строкового ресурса, либо в файле макета, либо динамически в методе onCreate, если вы повторно используете этот макет.

0 голосов
/ 28 октября 2011

Вам нужно позвонить ...

db.open();

в начале onCreate ().

Это откроет вашу базу данных и позволит получать данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...