Comment résoudre java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
-
25-10-2019 - |
Question
Je compile un projet Android contre API Level 11 (3.0) et j'ai ce code:
if (parent instanceof AbsListView) {
checked = ((AbsListView)parent).isItemChecked(position);
}
Quand je lance cette pré-3.0 (inférieure à l'API de niveau 11) périphériques, je reçois cette erreur:
java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
AbsListView , isItemChecked
est indiqué comme ayant API de niveau 1 compatibilité, alors pourquoi dois-je obtenir l'erreur?
La solution
Apparemment, c'est ce qui se passe:
Depuis l'API de niveau 1, le cadre Android a déjà isItemChecked
sur ListView
.
Cependant, la sortie de l'API de niveau 11, Google a déplacé la définition de isItemChecked
à AbsListView
, qui est la superclasse de ListView
. Ce changement ne code empêche pas existant (destiné à la compilation par rapport au niveau pré-API 11) pour compiler contre API de niveau 11, mais le fichier .class généré ressemble réellement pour isItemChecked
sur AbsListView
, qui n'existe pas sur le niveau pré-API 11 appareils .
Sur le rapport API Différences , il est dit:
boolean isItemChecked(int)
méthode a été définie localement, mais est maintenant héritée deAbsListView
.
Ceci est un piège dangereux, parce que la compatibilité ne peut pas être vérifiée sur la compilation de temps. Vous devez vous rappeler de le jeter comme ListView
et non AbsListView
. Peut-être que nous devrions éviter AbsListView
altogther.