studio setadapter listview header dataset adapter notify

setadapter - ClassCastException con ListView al ejecutar notifyDataSetChanged



listview c# (6)

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

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

He agregado una vista al encabezado de listVivew,

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

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

adapter.notifyDataSetChanged();

Eso siempre bloquea mi aplicación y me da el siguiente error:

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

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


API 18 y menor 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);



El motivo de la excepción de lanzamiento de clases 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 eliminar el pie de página listview.addFooterView (yourFooter); o listview.removeFooterView (yourFooter);


Parece que cada vez que utiliza vistas de encabezado / pie de página en una vista de lista, su ListView se envuelve con un HeaderViewListAdapter. Puedes arreglar esto usando el siguiente código:

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


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