2009-12-10 8 views
21

jestem mających problem z użyciem MatrixCursor aby wypełnić mój ListView:Korzystanie MatrixCursor i SimpleCursorAdapter w ListView z tekstem i obrazami

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

konstruowania SimpleCursorAdapter powoduje awarię. Nawet gdy próbowałem usunąć ikonę, aplikacja nadal się zawieszała. Oto moja 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: Oto stos wywołań w czasie katastrofy:

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] 

ROZWIĄZANIE:

znalazłem problem i rozwiązanie jest w mojej odpowiedzi poniżej.

+3

Po awarii, możesz przejrzeć ślad stosu, aby dowiedzieć się, gdzie coś jest nie tak - użyj adb logcat, DDMS lub perspektywy DDMS w Eclipse. Jeśli to nie pomoże ci w rozwiązaniu problemu, opublikuj ślad stosu jako zmianę w swoim pytaniu, ponieważ może to dostarczyć nam wskazówek. – CommonsWare

+0

Doskonałe pytanie ... Chciałbym znaleźć to dwa tygodnie temu! Dzięki za przykładowy kod. Dobra robota!! – mobibob

Odpowiedz

20

Wykreślmy ten problem, aby uniknąć doświadczenia w debugowaniu Javy przy użyciu środowiska Eclipse.

Uruchamianie aplikacji w debugerze spowodowało awarię RuntimeException. Kliknięcie bardzo górnego elementu stosu wywołań dało mi listę Zmiennych, na których zobaczyłem mój Wyjątek.

Określony błąd był nieprawidłowy, ponieważ mój MatrixCursor nie miał kolumny _id. Dodanie kolumny oznaczonej _id rozwiązało problem, a teraz wszystko działa.

Dzięki za ponowne spojrzenie na debuggera! Bądź wygodny i wiedz o swoich narzędziach!

Powiązane problemy