2012-09-29 8 views
8

Tengo una excepción que nunca pensé que vería. Una excepción de conversión de clase del adaptador al eliminar una vista de pie de página de un ListView (sic).Excepción de conversión de clase de adaptador al eliminar una vista de pie de página?

java.lang.ClassCastException: com.test.MyAdapter 
at android.widget.ListView.removeFooterView(ListView.java:381) 

¿Cómo puede suceder esto? ¿Qué tiene que ver la eliminación de un pie de página con excepción de lanzamiento de clase ???

La lista es un adaptador de varias listas tal vez por eso, pero sigue siendo una excepción de clase para eliminar un pie de página (sic).

Respuesta

12

Agregue su vista del pie de página al ListView antes de llamar al método setAdapter().

Agregado:

public void addFooterView (View v) 

desde: API Nivel 1 Añadir un punto de vista fijo a aparecer en la parte inferior de la lista. Si se llama addFooterView más de una vez, las vistas aparecerán en el orden en que se agregaron. Las vistas agregadas usando esta llamada pueden enfocarse si así lo desean.

NOTA: Llame esto antes de llamar a setAdapter. Esto es para que ListView pueda ajustar el cursor suministrado con uno que también represente las vistas de encabezado y pie de página.

Parámetros v La vista para agregar.

Source

También puede marcar esta interesting post.

Espero que esto ayude.

+0

¿Conoce qué podría producirse una excepción elenco de clase? –

+0

He actualizado mi respuesta con esta interesante publicación http://stackoverflow.com/questions/4393775/android-classcastexception-when-adding-a-header-view-to-expandablelistview Creo que esto responderá a su pregunta. –

+0

@CodeDroid si encontraste mi respuesta correcta, ¿puedes aceptarla? Gracias –

9

Esto es algo de código para la respuesta anterior, se trabajó en mi caso:

tuviera que establecer un footerView (es un loadingView en un ListView con paginación) a mi ListView antes de su adaptador y luego lo elimina . En primer lugar me inicializa mi loadingView de un archivo de diseño en el método OnCreate:

LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
loadingView = layoutInflater.inflate(R.layout.loading_view, null); 

Luego usé 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); 
    } 
} 
+0

Esto es lo que terminó trabajando para mí también. Establezca un encabezado/pie de página, inicie el adaptador y luego elimine el encabezado/pie de página. – wblaschko

+0

Llamar a setAdapter nuevamente después de agregar un encabezado/pie de página es la razón por la cual esta corrección funciona –

+0

¿Podría hacer un 'listView.getAdapter()! = Null' antes de agregar el pie de página? – ono

1

El problema no viene desde removeFooterView(), pero desde addFooterView(). Si usted lee la documentación, se establece que una envoltura será añadido a su adaptador:

Si el adaptador del ListView no se extiende HeaderViewListAdapter, que será envuelto con una instancia de apoyo de WrapperListAdapter.

Por lo tanto, debe utilizar el captador para recuperar el adaptador envuelto y convertirlo a su adaptador.De esta manera:

((MyAdapter) ((HeaderViewListAdapter) listView.getAdapter()).getWrappedAdapter()) 

Espero que esto te ayude con tu problema.

Saludos,

0

Agregando las otras respuestas, si va a añadir/quitar los pies de página de forma dinámica (por ejemplo, si llegan a la parte inferior de la lista y luego va a añadir una vista de pie de página) lo más fácil es reemplazar setAdapter en su ListView y añadir un nuevo objeto View como el pie allí, esto asegurará que el adaptador está envuelto en el HeaderViewListAdapter:

@Override 
public void setAdapter(ListAdapter adapter) { 
    addFooterView(new View(getContext())); 
    super.setAdapter(adapter); 
} 
Cuestiones relacionadas