Using MatrixCursor and SimpleCursorAdapter in a ListView with text and images
Asked Answered
T

1

21

I'm having an issue using a MatrixCursor to populate my ListView:

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 the SimpleCursorAdapter causes a crash. Even when I tried removing the icon the app still crashed. Here is my 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: Here is the call stack at the time of the 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]  

SOLUTION:

I found the problem and the solution is in my answer below.

Tales answered 10/12, 2009 at 16:19 Comment(2)
When you get a crash, you can look at the stack trace to help figure out where things are going wrong -- use adb logcat, DDMS, or the DDMS perspective in Eclipse. If that does not give you enough help to fix the problem, post the stack trace as an edit to your question, as it may give us some clues.Testator
Excellent question ... I wish I found this two weeks ago! Thanks for the sample code. Good job!!Irreclaimable
T
20

Let's chalk this one up to inexperience with debugging Java using Eclipse.

Running the application in the debugger, I crashed with a RuntimeException. Clicking the very top element in the call stack gave me the list of Variables, at which I saw my Exception e.

The specific error was an InvalidArgument because my MatrixCursor did not have an _id column. Adding a column labeled _id fixed the problem and now everything works.

Thanks for making me look at the debugger again! Be comfortable with and knowledgeable about your tools!

Tales answered 10/12, 2009 at 18:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.