Come risolvere java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
-
25-10-2019 - |
Domanda
Sto compilando un progetto Android contro API livello 11 (3.0) e non ho questo codice:
if (parent instanceof AbsListView) {
checked = ((AbsListView)parent).isItemChecked(position);
}
Quando ho eseguito questo in pre-3.0 (inferiore a API livello 11) dispositivi, ottengo questo errore:
java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
AbsListView documentazione , isItemChecked
è indicato come avente livello di API 1 compatibilità, allora perché ottengo l'errore?
Soluzione
A quanto pare questo è ciò che accade:
Dal API di livello 1, quadro Android è già isItemChecked
su ListView
.
Tuttavia, sul rilascio di API livello 11, Google ha spostato la definizione di isItemChecked
a AbsListView
, che è la superclasse di ListView
. Questo cambiamento non impedisce codice esistente (inteso per la compilazione contro pre-API livello 11) per compilare contro API livello 11, ma il file generato .class in realtà cerca isItemChecked
su AbsListView
, che non esiste in pre-API livello 11 dispositivi .
Al Differenze API Rapporto , si afferma:
boolean isItemChecked(int)
metodo è stato definito localmente, ma viene ora ereditata dallaAbsListView
.
Questa è una trappola pericolosa, poiché la compatibilità non può essere controllato sulla compilazione tempo. È necessario ricordarsi di lanciare come ListView
e non AbsListView
. Forse dovremmo evitare AbsListView
altogther.