2011-09-05 18 views
5

Estoy compilando un proyecto androide contra Nivel API 11 (3,0) y tengo este código:¿Cómo resolver java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked

if (parent instanceof AbsListView) { 
    checked = ((AbsListView)parent).isItemChecked(position); 
} 

Cuando ejecuto esto en los dispositivos de pre-3.0 (menor que el nivel de API 11), me sale este error:

java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked 

en AbsListView documentation, isItemChecked se afirma que tienen compatibilidad API de nivel 1, entonces ¿por qué recibo el error?

Respuesta

10

Al parecer esto es lo que sucede:

Desde API de nivel 1, el marco Android tiene ya isItemChecked en ListView.

Sin embargo, en el lanzamiento de API Nivel 11, Google movió la definición de isItemChecked a AbsListView, que es la superclase de ListView. Este cambio no impide que el código existente (destinado a compilar contra el nivel 11 anterior a la API) se compile contra el nivel 11 de API, pero el archivo .class generado realmente busca isItemChecked en AbsListView, que no existe en dispositivos de nivel 11 previos a la API. .

Por API Differences Report, se afirma:

boolean isItemChecked(int) Method was locally defined, but is now inherited from AbsListView .

Esta es una trampa peligrosa, ya que la compatibilidad no se puede comprobar en tiempo de compilación en absoluto. Debe recordar lanzarlo como ListView y no AbsListView. Tal vez deberíamos evitar AbsListView altogther.

+2

La documentación de AbsListView debe ser reparada. Ciertamente no se agregó en la API 1. Lo mismo ocurre con 'AbsListView.setAdaper', pero lo actualizaron. – xmen

Cuestiones relacionadas