java - ordenar - llenar listview con arraylist android
Uso de MatrixCursor y SimpleCursorAdapter en un ListView con texto e imágenes (1)
Tengo un problema al utilizar un MatrixCursor
para completar mi 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);
}
La construcción del SimpleCursorAdapter
provoca un bloqueo. Incluso cuando intenté quitar el ícono, la aplicación aún fallaba. Aquí está mi 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>
Editar: Aquí está la pila de llamadas en el momento del bloqueo:
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]
SOLUCIÓN:
Encontré el problema y la solución está en mi respuesta a continuación.
Asignemos esto a la inexperiencia con la depuración de Java usando Eclipse.
Al ejecutar la aplicación en el depurador, me estrellé con una excepción RuntimeException. Al hacer clic en el elemento superior de la pila de llamadas, me dieron la lista de variables, en la que vi mi excepción e.
El error específico fue un InvalidArgument porque mi MatrixCursor no tenía una columna _id. Agregar una columna etiquetada _id solucionó el problema y ahora todo funciona.
¡Gracias por hacerme ver al depurador otra vez! ¡Siéntete cómodo y conocedor de tus herramientas!