2012-09-29 7 views
8

Ho un'eccezione che non avrei mai pensato di vedere. Un'eccezione cast di classe dell'adattatore durante la rimozione di una vista a piè di pagina da un ListView (sic).Eccezione cast della classe dell'adattatore durante la rimozione di una vista Piè di pagina?

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

Come può accadere? Che cosa deve fare la rimozione di un piè di pagina con l'eccezione del cast di classe ????

La lista è un adattatore multi-list forse è per questo, ma ancora un'eccezione calco per la rimozione di un piè di pagina (sic).

risposta

12

Aggiungi la tua vista piè di pagina per ListView prima di chiamare setAdapter() metodo.

Aggiunto:

public void addFooterView (View v) 

dal: API livello 1 Aggiungere una vista fissato per comparire in fondo alla lista. Se addFooterView viene chiamato più di una volta, le viste verranno visualizzate nell'ordine in cui sono state aggiunte. Le visualizzazioni aggiunte utilizzando questa chiamata possono essere messe a fuoco, se lo desiderano.

NOTA: richiamare questo prima di chiamare setAdapter. In questo modo ListView può racchiudere il cursore fornito con uno che terrà conto anche delle visualizzazioni di intestazione e piè di pagina.

Parametri v La vista da aggiungere.

Source

Inoltre è possibile controllare questo interesting post.

Spero che questo aiuti.

+0

sapete perché potrebbe verificarsi un'eccezione di classe cast? –

+0

Ho aggiornato la mia risposta a questo post interessante http://stackoverflow.com/questions/4393775/android-classcastexception-when-adding-a-header-view-to-expandablelistview Penso che questa sarà rispondere alla tua domanda. –

+0

@CodeDroid se hai trovato la mia risposta corretta, puoi accettarla per favore. Grazie –

9

Questo è un codice per la risposta di cui sopra, ha funzionato nel mio caso:

ho dovuto impostare un footerView (è un loadingView in una lista con impaginazione) al mio listView prima di che sia l'adattatore e quindi rimuoverlo . Per prima cosa ho inizializzato il mio loadingView da un file di layout in metodo OnCreate:

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

Poi ho usato questa soluzione con lo stesso metodo:

this.setIsLoading(true); 
listView.setAdapter(adapter); 
this.setIsLoading(false); 

Dove

private void setIsLoading(boolean isLoading) 
{ 
    this.isLoading = isLoading; 

    if (isLoading) { 
     listView.addFooterView(loadingView); 
    } 
    else { 
     listView.removeFooterView(loadingView); 
    } 
} 
+0

Questo è quello che ha funzionato anche per me. Imposta un'intestazione/piè di pagina, avvia l'adattatore, quindi rimuovi l'intestazione/il piè di pagina. – wblaschko

+0

Chiamata di nuovo setAdapter dopo l'aggiunta di un'intestazione/piè di pagina è il motivo per cui questa correzione funziona –

+0

Potrebbe anche fare un 'listView.getAdapter()! = Null' prima di aggiungere il piè di pagina? – ono

1

Il problema non fa venire da removeFooterView(), ma da addFooterView(). Se leggete la documentazione, si afferma che un wrapper verrà aggiunto al vostro adattatore:

Se l'adattatore del ListView non si estende HeaderViewListAdapter, verrà avvolto con un'istanza di supporto di WrapperListAdapter.

Quindi è necessario utilizzare il getter per recuperare l'adattatore avvolto e gettato al vostro adattatore.Come questo:

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

Spero che questo ti aiuterà con il tuo problema.

Con i migliori saluti,

0

Aggiunta alle altre risposte, se si sta aggiunta/rimozione piè di pagina in modo dinamico (come se raggiungono il fondo della vostra lista e poi si aggiunge una vista piè di pagina) la cosa più facile è quello di sovrascrivere setAdapter nella vostra ListView e aggiungere un nuovo oggetto View come il piè di pagina c'è, questo garantirà l'adattatore è avvolto nel HeaderViewListAdapter:

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