2010-12-09 17 views
36

He añadido miras a la cabecera de listVivew,ClassCastException con ListView al ejecutar notifyDataSetChanged

View TopSearch = (View) View.inflate(this, R.layout.search, null); 
    lv.addHeaderView(TopSearch, null, false); 

Y todo está bien hasta que intento ejecutar (cuando cambian los datos)

adapter.notifyDataSetChanged(); 

Eso siempre bloquear mi aplicación y darme el siguiente error:

> java.lang.ClassCastException: android.widget.HeaderViewListAdapter

Si elimino la vista de encabezado, entonces no hay ningún error. ¿Alguna sugerencia? Gracias.

+0

Debe usar 'ListView.LayoutParams'. Marque [esta pregunta] [1]. [1]: http://stackoverflow.com/questions/4393775/android-classcastexception-when-adding-a-header-view-to-expandablelistview/4401369#4401369 – Macarse

Respuesta

-2
public class YourOwnList extends ListActivity { 
    private EfficientAdapter mAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     mAdapter = new EfficientAdapter(/*your parameters for the adapter*/); 
    } 

    private void yourMethod() { 
     mAdapter.notifyDataSetChanged(); 
    } 

    private static class EfficientAdapter extends CursorAdapter { 
     // your adapter 
    } 
} 
+2

Bienvenido a StackOverflow. Siempre se recomienda agregar una o dos líneas sobre el código que está publicando, esto ayuda a los miembros a comprender mejor su código – Vivek

123

Parece que cada vez que utilice puntos de vista de encabezado/pie de página en una vista de lista, el ListView se envuelve con una HeaderViewListAdapter. Puede solucionarlo usando el siguiente código:

((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged(); 
+2

My 'listView.getAdapter()' no es una instancia de 'HeaderViewListAdapter' después de que se visualizó un pie de página adicional. – ono

+0

Muchas gracias. No pude seguir el siguiente enfoque debido a la estructura de mi aplicación – rahulinaction

+0

@ono: eso sería FooterViewListAdapter, creo – divyenduz

12

API 18 y menos se confunde con lo que está envolviendo. Para ayudarlo, configure su encabezado y/o pie de página ANTES de asignar el adaptador. De esta forma, se realiza el envoltorio correcto debajo de las sábanas. A continuación, elimine el encabezado/pie de página inmediatamente después (si eso es lo que desea).

myList.addFooterView(myFooterView); 
myList.setAdapter(adapter); 
myList.removeFooterView(myFooterView); 
0

@ mussharapp ¡la respuesta es perfecta y funciona! Sin embargo me parece más conveniente simplemente almacenar en caché el adaptador en una variable miembro para su uso posterior antes de hacer setAdapter():

mAdapter = new YourAdapter(ctx, items); 
listView.addFooterView(v); 
listView.setAdapter(mAdapter); 
0

El El motivo de la excepción de clase de lanzamiento es que la vista de lista no se incluyó en la vista de la lista de encabezados. Por lo tanto, no podemos agregar pies de página o encabezado a la vista en lista directamente. Por lo tanto, antes de configurar el adaptador a la vista de lista, agregue la vista ficticia como vista de encabezado o pie de página. Luego ajuste el adaptador a la vista de lista. Esto hace que listview a instancia de headerviewslist. Luego puede agregar y eliminar pies de página fácilmente de la vista de lista como siempre.

listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter): 

Después de configurar el adaptador, puede agregar o quitar el pie de página listview.addFooterView (yourFooter); o listview.removeFooterView (yourFooter);

+0

Debe agregar algunos ejemplos de código –

Cuestiones relacionadas