Android SimpleCursorAdapter ListView Ошибка

Я возился с SimpleCursorAdapter и Listview и получал разные результаты. Сначала я получал некоторые результаты в своем списке, но макет был не очень хорошим, поэтому я решил это исправить. Однако это, похоже, все испортило, теперь приложение продолжает падать с ошибкой типа исключения нулевого указателя, и я не могу понять.

Мой XML для списка

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/linearLayout1" >





        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true" >

        </ListView>

    </RelativeLayout>

</RelativeLayout>

</ScrollView> 

Мой класс активности с ListActivity

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.playerdata);
    //list = (ListView) findViewById(R.id.list);

    mDbHelper = new PlayerDbAdapter(this);
    mDbHelper.open();
    fillData();
    registerForContextMenu(getListView());
}

 private void fillData() {
    Cursor players = mDbHelper.fetchAllPlayers();
    startManagingCursor(players);

    // Create an array to specify the fields we want to display in the list (only TITLE)
    String[] from = new String[]{PlayerDbAdapter.KEY_TITLE,PlayerDbAdapter.KEY_BODY};


    // and an array of the fields we want to bind those fields to (in this case just text1)
    int[] to = new int[]{R.id.playerPosition,R.id.playerName};

    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter playerlist = 
        new SimpleCursorAdapter(this, R.layout.playerinfo , players, from, to);
    setListAdapter(playerlist);
}

ЛогКэт

04-15 20:09:07.326: E/AndroidRuntime(600): FATAL EXCEPTION: main
04-15 20:09:07.326: E/AndroidRuntime(600): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{your.dissertation.project/your.dissertation.project.PlayersActivity}: java.lang.NullPointerException
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1544)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.os.Looper.loop(Looper.java:123)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.ActivityThread.main(ActivityThread.java:3647)
04-15 20:09:07.326: E/AndroidRuntime(600):  at java.lang.reflect.Method.invokeNative(Native Method)
04-15 20:09:07.326: E/AndroidRuntime(600):  at java.lang.reflect.Method.invoke(Method.java:507)
04-15 20:09:07.326: E/AndroidRuntime(600):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-15 20:09:07.326: E/AndroidRuntime(600):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-15 20:09:07.326: E/AndroidRuntime(600):  at dalvik.system.NativeStart.main(Native Method)
04-15 20:09:07.326: E/AndroidRuntime(600): Caused by: java.lang.NullPointerException
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.Activity.setContentView(Activity.java:1657)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.ListActivity.ensureList(ListActivity.java:312)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.ListActivity.getListView(ListActivity.java:297)
04-15 20:09:07.326: E/AndroidRuntime(600):  at your.dissertation.project.PlayersActivity.<init>(PlayersActivity.java:27)
04-15 20:09:07.326: E/AndroidRuntime(600):  at java.lang.Class.newInstanceImpl(Native Method)
04-15 20:09:07.326: E/AndroidRuntime(600):  at java.lang.Class.newInstance(Class.java:1409)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
04-15 20:09:07.326: E/AndroidRuntime(600):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1536)
04-15 20:09:07.326: E/AndroidRuntime(600):  ... 11 more

Мой класс курсора

 public Cursor fetchAllPlayers()
  {
    return this.mDb.query("players", new String[] { "_id", "Player_Name", "Player_Position" }, null, null, null, null, null);
  }

person b0w3rb0w3r    schedule 15.04.2013    source источник
comment
Выложите весь логкэт, пожалуйста.   -  person TJ Thind    schedule 16.04.2013
comment
Обновил его со всем логарифмом   -  person b0w3rb0w3r    schedule 16.04.2013


Ответы (3)


Вы близки, но я вижу пару проблем:

  1. startManagingCursor устарел. Вместо этого вы должны использовать CursorLoader. Это задокументировано в учебном классе по Android Загрузка данных в фоновом режиме. . Это не вызывает вашего RuntimeException, но это плохая практика программирования.
  2. Настройка вашего ListView и SimpleCursorAdapter требует доработки. Вы сделали ошибку, которая довольно распространена среди людей, использующих SimpleCursorAdapter. Параметры конструктора
SimpleCursorAdapter(Context, item_layout_file, Cursor, from_columns, to_fields)

где

  • Context – это объект Context.
  • item_layout_file – это файл layout.xml, содержащий макет одного элемента или строки вашего списка. В вашем случае этот файл макета будет содержать TextView (или два?), а не ListView. Вы создаете объект, привязанный к ListView, а не к самому ListView.
  • Курсор — это курсор, содержащий данные.
  • from_columns — это массив строк, содержащий имена столбцов.
  • to_fields – это целочисленный массив, содержащий идентификаторы ресурсов объектов представления в файле макета элемента.

Кроме того, есть такие требования:

  • количество элементов в from_columns должно совпадать с количеством элементов в to_fields. Я подозреваю, что это вызывает ошибку.
  • Курсор должен содержать столбец с именем "_ID".

Однако from_columns не обязательно должен содержать все столбцы курсора.

person Joe Malin    schedule 15.04.2013
comment
То, что вы сказали, имело большой смысл, я собираюсь попробовать еще раз. Большое спасибо. Однако моя цель разработки - 9, и я заметил, что CursorLoader был реализован в 11? В любом случае спасибо, я думаю, что пока буду придерживаться Simple. Будет держать вас в курсе прогресса. - person b0w3rb0w3r; 16.04.2013
comment
Таким образом, мне удалось исправить нарушения from_column и to_field, а также создать новый файл xml с двумя текстовыми представлениями, которые я связал с to_feild, однако я все еще получаю ошибку nullexception. Возможно, это связано с последним пунктом списка, который я действительно не понимаю, что вы имели в виду под столбцом идентификатора. Обновленный код с моим классом курсора, он имеет столбец идентификатора. - person b0w3rb0w3r; 16.04.2013

Изменить
String[] from = new String[]{PlayerDbAdapter.KEY_TITLE,PlayerDbAdapter.KEY_BODY};

to

String[] from = new String[]{PlayerDbAdapter.KEY_TITLE};
person Hoan Nguyen    schedule 15.04.2013
comment
Я исправил to_feild, чтобы иметь дополнительный столбец, поскольку мне нужны были оба. Все еще с той же проблемой. - person b0w3rb0w3r; 16.04.2013
comment
Разместите свой код, вы неправильно создаете экземпляр SimpleCursorAdapter. - person Hoan Nguyen; 16.04.2013
comment
Обновлен новым кодом адаптера. Все еще получаю ошибку nullpointexeption. - person b0w3rb0w3r; 16.04.2013

Ваш ListView должен иметь идентификатор android:id="@android:id/list", а не android:id="@+id/list"

person rubenlop88    schedule 15.04.2013
comment
Но если я это сделаю, как мне вызвать это на SimpleCursorAdapter? Поскольку он больше не распознает список. - person b0w3rb0w3r; 16.04.2013
comment
Вы имеете в виду эту строку list = (ListView) findViewById(R.id.list)? Должно быть list = (ListView) findViewById(android.R.id.list) - person rubenlop88; 16.04.2013