2009-12-10 4 views
21

Sto avendo un problema con un MatrixCursor per popolare il mio ListView:Utilizzando MatrixCursor e SimpleCursorAdapter in un ListView con testo e immagini

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); 
} 

Costruzione del SimpleCursorAdapter causa un crash. Anche quando ho provato a rimuovere l'icona, l'app si bloccava ancora. Ecco la mia 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: Qui è lo stack di chiamate al momento del crash:

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] 

SOLUZIONE:

ho trovato il problema e la soluzione è nella mia risposta qui sotto.

+3

Quando si verifica un arresto anomalo, è possibile esaminare la traccia dello stack per aiutare a capire dove le cose vanno male: utilizzare adb logcat, DDMS o la prospettiva DDMS in Eclipse. Se questo non ti fornisce abbastanza aiuto per risolvere il problema, pubblica la traccia dello stack come una modifica alla tua domanda, poiché potrebbe darci qualche indizio. – CommonsWare

+0

Ottima domanda ... Vorrei averlo trovato due settimane fa! Grazie per il codice di esempio. Buon lavoro!! – mobibob

risposta

20

Aggiungiamo questo a inesperienza con il debug di Java utilizzando Eclipse.

L'esecuzione dell'applicazione nel debugger, si è arrestata in modo anomalo con un RuntimeException. Facendo clic sull'elemento più in alto nello stack di chiamate mi ha dato l'elenco delle variabili, in cui ho visto la mia eccezione e.

L'errore specifico era un oggetto non valido perché il mio MatrixCursor non aveva una colonna _id. L'aggiunta di una colonna con etichetta _id ha risolto il problema e ora tutto funziona.

Grazie per avermi fatto vedere di nuovo il debugger! Siate a vostro agio e ben informati sui vostri strumenti!