Cómo resolver java.lang.nosuchmethoderror: android.widget.abslistview.isitemchecked
-
25-10-2019 - |
Pregunta
Estoy compilando un proyecto de Android contra API Nivel 11 (3.0) y tengo este código:
if (parent instanceof AbsListView) {
checked = ((AbsListView)parent).isItemChecked(position);
}
Cuando ejecuto esto en dispositivos anteriores a 3.0 (inferior al nivel de API 11), obtengo este error:
java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
En Documentación de AbsListView, isItemChecked
se afirma que tiene una compatibilidad API de nivel 1, entonces ¿por qué recibo el error?
Solución
Aparentemente esto es lo que sucede:
Desde el nivel 1 de API, Android Framework ya ha 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 evita que el código existente (destinado a compilar contra el nivel 11 pre-API) compilara contra el nivel de API 11, pero el archivo .class generado realmente busca isItemChecked
en AbsListView
, que no existe en dispositivos de nivel 11 pre-API.
Sobre el Informe de diferencias de API, se dice:
boolean isItemChecked(int)
El método se definió localmente, pero ahora se hereda deAbsListView
.
Esta es una trampa peligrosa, porque la compatibilidad no se puede verificar en el tiempo de compilación. Debes recordar lanzarlo como ListView
y no AbsListView
. Tal vez deberíamos evitar AbsListView
Altogther.