2009-12-10 4 views
21

Ich bin ein Problem mit einem MatrixCursor mit meinem ListView füllen:Mit MatrixCursor und SimpleCursorAdapter in einem Listview mit Text und Bildern

private void fillData() { 
    String[] menuCols = new String[] { "icon", "item", "price" }; 
    int[] to = new int[] { R.id.icon, R.id.item, R.id.price }; 

    MatrixCursor menuCursor = new MatrixCursor(menuCols); 
    startManagingCursor(menuCursor); 

    menuCursor.addRow(new Object[] { R.drawable.chicken_sandwich, "Chicken Sandwich", "$3.99" }); 

    SimpleCursorAdapter menuItems = new SimpleCursorAdapter(
      this, R.layout.menu_row, menuCursor, menuCols, to); 

    setListAdapter(menuItems); 
} 

Constructing der SimpleCursorAdapter verursacht einen Absturz. Selbst wenn ich versuchte, das Symbol zu entfernen, stürzte die App immer noch ab. Hier ist meine menu_row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </ImageView> 
    <TextView 
     android:id="@+id/item" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </TextView> 
    <TextView 
     android:id="@+id/price" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </TextView> 
</LinearLayout> 

Edit: Hier wird der Call-Stack zum Zeitpunkt des Absturzes:

Thread [<3> main] (Suspended (exception RuntimeException)) 
    ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2481 
    ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2497 
    ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 119 
    ActivityThread$H.handleMessage(Message) line: 1848 
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 123 
    ActivityThread.main(String[]) line: 4338  
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
    Method.invoke(Object, Object...) line: 521 
    ZygoteInit$MethodAndArgsCaller.run() line: 860 
    ZygoteInit.main(String[]) line: 618 
    NativeStart.main(String[]) line: not available [native method] 

LÖSUNG:

ich das Problem gefunden und die Lösung ist in meiner Antwort unten.

+3

Wenn Sie einen Absturz bekommen, können Sie sich die Stack-Trace ansehen, um herauszufinden, wo etwas schief läuft - verwenden Sie adb logcat, DDMS oder die DDMS-Perspektive in Eclipse. Wenn das Ihnen nicht genügend Hilfe gibt, um das Problem zu beheben, veröffentlichen Sie den Stapel-Trace als eine Bearbeitung Ihrer Frage, da sie uns einige Hinweise geben kann. – CommonsWare

+0

Ausgezeichnete Frage ... Ich wünschte, ich hätte das vor zwei Wochen gefunden! Danke für den Beispielcode. Gut gemacht!! – mobibob

Antwort

20

Lassen Sie uns diese Unerfahrenheit beim Debuggen von Java mit Eclipse erklären.

Beim Ausführen der Anwendung im Debugger stürzte ich mit einer RuntimeException ab. Ein Klick auf das oberste Element im Call-Stack gab mir die Liste der Variablen, bei denen ich meine Exception e gesehen hatte.

Der spezifische Fehler war ein InvalidArgument, weil mein MatrixCursor keine _id Spalte hatte. Das Hinzufügen einer Spalte mit der Bezeichnung _id hat das Problem behoben und jetzt funktioniert alles.

Vielen Dank, dass Sie mich wieder auf den Debugger schauen lassen! Seien Sie mit Ihren Werkzeugen vertraut und wissen Sie Bescheid!

Verwandte Themen