Android: ClassCastException al agregar una vista de encabezado a ExpandableListView
Estoy tratando de agregar un encabezado a un ExpandableListView así:
headerView = View.inflate(this, R.layout.header, null); expandableListView.addHeaderView(headerView); expandableListView.setAdapter(new SectionedAdapter(this));
Lo que me da el siguiente error:
- Android Layout_weight
- Cómo envolver los botones de imagen en un diseño lineal horizontal?
- Scrollview puede alojar sólo un hijo directo
- Android: Cómo establecer el tamaño de un diseño de forma programática
- Android: cómo escalar una imagen para llenar el fondo de un LinearLayout sin preservar la relación de aspecto?
12-08 16:23:42.354: ERROR/AndroidRuntime(421): Caused by:java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams 12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.clearRecycledState(ListView.java:504) 12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.resetList(ListView.java:490) 12-08 16:23:42.354:ERROR/AndroidRuntime(421):at android.widget.ListView.setAdapter(ListView.java:422) 12-08 16:23:42.354:ERROR/AndroidRuntime(421): at android.widget.ExpandableListView.setAdapter(ExpandableListView.java:475)
Esto sucede en la llamada a expandableListView.setAdapter(new SectionedAdapter(this))
, pero no puedo entender por qué. ¿Algunas ideas?
- ¿Cómo igualmente span botones / diseños verticalmente en android?
- ScrollView oculta el diseño lineal inferior
- Android dificultad con linearlayout dentro de scrollview
- Android: Añadir una vista de texto al diseño lineal mediante programación
- ScrollView no se desplaza hasta el final del margen inferior del LinearLayout interno
- Ventaja de usar Single TableLayout en lugar de LinearLayouts múltiples como TableRow extends LinearLayout only
- Alineación de fragmentos con RelativeLayout
- Android - Problemn al establecer la visibilidad en CoordinatorLayout
Ok, me imaginé esto. Me deshice del error de tiempo de ejecución mediante la programación de configuración LayoutParams de la vista a ListView LayoutParams, así:
headerView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, ListView.LayoutParams.WRAP_CONTENT));
Antes de añadir la vista. La razón de ser se encuentra en los documentos Android:
el cual establece que:
Estos parámetros de suministro a los padres de este punto de vista que especifica cómo se debe arreglar. Hay muchas subclases de ViewGroup.LayoutParams, y éstas corresponden a las diferentes subclases de ViewGroup que son responsables de organizar a sus hijos.
Así que, básicamente, si está agregando una vista a otra, DEBE establecer LayoutParams de la vista en el tipo LayoutParams que usa el padre o obtendrá un error de tiempo de ejecución.
A pesar de que la respuesta anterior podría funcionar para muchos, todavía hay una mejor explicación. ClassCastException
es el comportamiento normal después de llamar a listview.addHeaderView
o listview.addFooterView
.
La razón es que el adaptador inicial se envuelve en el HeaderViewListAdapter
. Para que su adaptador utilice este código.
YourAdapter ya = (YourAdapter) ((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter();
Código tomado de aquí
En mi caso esto no funcionó. Tuve que configurar un footerView a mi listView antes de configurar su adaptador. Primero inicialice mi loadingView de un archivo de disposición en método OnCreate:
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); loadingView = layoutInflater.inflate(R.layout.loading_view, null);
Entonces utilicé esta solución en el mismo método:
this.setIsLoading(true); listView.setAdapter(adapter); this.setIsLoading(false);
Dónde
private void setIsLoading(boolean isLoading) { this.isLoading = isLoading; if (isLoading) { listView.addFooterView(loadingView); } else { listView.removeFooterView(loadingView); } }
Debe poner vista de padre a su vista inflada.
ListView listview = (ListView) findViewById(R.id.listview); headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view listview.addHeaderView(headerview);
- ¿Cómo puedo reducir el relleno interno alrededor del texto dentro de un objeto de botón de Android?
- Valor de atributo de formato "android: drawable" no válido