2012-06-20 15 views
10

estoy recibiendo informes de fallos enCrash en ListView.removeFooterView (Ver)

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

El error es nulo excepción de puntero. Compruebo que listView en sí no es nulo. ¿Qué causa esto? ¿Es necesario asegurarse de que la vista que se va a eliminar no sea nula? ¿Es suficiente o primero debo verificar que la vista del pie de página en realidad se haya agregado?

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

¡Me parece que este método debe ser lo suficientemente robusto como para no bloquearse! ¿Por qué no solo devuelve falso si no puede eliminar la vista?

PS. Me gustaría saber si alguien más ha visto esto.

Respuesta

13

Lamentablemente, no menciona de qué versión de Android provienen los informes de error. Sin embargo, mirando el código fuente, Android 2.1-update1 parece ser un buen candidato.

Voy a copiar en todo el método para dejar las cosas claras:

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

Ahora compare por encima de removeFooterView(...) método con la implementación de una plataforma más reciente:

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

Como se puede ver , he agregado en un par de cheques adicionales para ciertos miembros que no son null. Eso sugeriría que el primer método fallará en la línea 274 si mAdapter == null, mientras que eso no causaría un bloqueo con la implementación más nueva.

Para solucionarlo, todo lo que necesita hacer es agregar algo como lv.getAdapter() != null antes de intentar eliminar la vista del pie de página.

+0

¿Cuál es la política para agregar pies de página? Estoy obteniendo este error nuevamente en FROYO y en listView.getFooterCount()> 0. –

+1

El trabajo alrededor de "lv.getAdapter()! = Null" funcionó para mí – djleop

+0

Tuve la posibilidad de llamar a removeFooter() después de configurar el adaptador . – salcosand

0

si retira la documentación se dará cuenta de que esto es realmente el caso:

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

devoluciones

cierto si se quita la vista, falso si la vista no era una pie de página vista

Por lo tanto, debe agregar una verificación nula para la vista y la listaView o si se trata de una exc estado epcional (ocurre muy raramente y luego envuélvalo en un bloque de excepción).

+0

¡Cerrar un puntero nulo en un bloque de excepción seguirá bloqueándose! –

+0

La documentación no indica que intentar eliminar una vista nula bloqueará su aplicación. –

+0

No estoy seguro de que la eliminación de una vista nula bloqueará la aplicación. Creo que podría ser el adaptador nulo. –