2012-06-20 14 views
10

sto ottenendo segnalazioni di crash suCrash su ListView.removeFooterView (View)

android.widget.ListView lv; lv.removeFooterView(v) 

L'errore è un'eccezione di puntatore nullo. Controllo che listView non sia nullo. Che cosa causa questo? È necessario assicurarsi che la vista da rimuovere non sia nulla? È sufficiente o devo prima verificare anche che la vista del footer sia stata effettivamente aggiunta?

java.lang.NullPointerException 
at android.widget.ListView.removeFooterView(ListView.java:374) 

Mi sembra che questo metodo dovrebbe essere abbastanza robusto da non schiantarsi! Perché non restituisce semplicemente false se non è possibile rimuovere la vista?

PS. Mi piacerebbe sapere se qualcun altro ha visto questo?

risposta

13

Sfortunatamente non si menziona la versione di Android da cui provengono gli errori. Tuttavia, guardando il codice sorgente, Android 2.1-update1 sembra un buon candidato.

mi limiterò a copiare in tutto il metodo per fare le cose in chiaro:

public boolean removeFooterView(View v) { 
    if (mFooterViewInfos.size() > 0) { 
     boolean result = false; 
     if (((HeaderViewListAdapter) mAdapter).removeFooter(v)) { // <- line 274 
      mDataSetObserver.onChanged(); 
      result = true; 
     } 
     removeFixedViewInfo(v, mFooterViewInfos); 
     return result; 
    } 
    return false; 
} 

Ora confrontate sopra removeFooterView(...) metodo con l'implementazione di una piattaforma più recente:

public boolean removeFooterView(View v) { 
    if (mFooterViewInfos.size() > 0) { 
     boolean result = false; 
     if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeFooter(v)) { 
      if (mDataSetObserver != null) { 
       mDataSetObserver.onChanged(); 
      } 
      result = true; 
     } 
     removeFixedViewInfo(v, mFooterViewInfos); 
     return result; 
    } 
    return false; 
} 

Come si può vedere , l'ho aggiunto in un paio di controlli extra per alcuni membri non essendo null. Ciò suggerirebbe che il primo metodo fallirà effettivamente sulla riga 274 se mAdapter == null, mentre ciò non causerebbe un arresto anomalo con l'implementazione più recente.

Per aggirare il problema, è sufficiente aggiungere qualcosa come lv.getAdapter() != null prima di provare a rimuovere la visualizzazione del piè di pagina.

+0

Qual è la politica per l'aggiunta di piè di pagina. Ricevo di nuovo questo errore su FROYO e su listView.getFooterCount()> 0. –

+1

Il lavoro attorno a "lv.getAdapter()! = Null" ha funzionato per me – djleop

+0

Ho avuto la possibilità di chiamare removeFooter() dopo aver impostato l'adattatore . – salcosand

0

se si estrae la documentazione si noterà che questo è effettivamente il caso:

http://developer.android.com/reference/android/widget/ListView.html)

Returns

vero se la vista è stato rimosso, false se la vista non era un footer view

Quindi è necessario aggiungere un controllo Null per la vista e il listView o se si tratta di un exc stato epizionale (accade molto raramente e poi lo avvolge in un blocco di eccezioni).

+0

Il blocco di un puntatore nullo in un blocco di eccezioni si blocca ancora! –

+0

La documentazione non indica che il tentativo di rimuovere una vista nulla causerà il crash dell'applicazione. –

+0

Non sono convinto che la rimozione di una vista nulla causerà il crash dell'applicazione. Penso che potrebbe essere l'adattatore nullo. –