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

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

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

È stato utile?

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top