Cómo resolver java.lang.nosuchmethoderror: android.widget.abslistview.isitemchecked

StackOverflow https://stackoverflow.com/questions/7306430

  •  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?

¿Fue útil?

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 de AbsListView.

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top