2011-09-05 13 views
5

Mam kompilacji Androida projekt przeciwko API poziom 11 (3.0) i mam ten kod:Jak rozwiązać java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked

if (parent instanceof AbsListView) { 
    checked = ((AbsListView)parent).isItemChecked(position); 
} 

Kiedy uruchomić ten w pre-3.0 (niższy niż poziom API 11) urządzeń, otrzymuję ten błąd:

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

w AbsListView documentation, isItemChecked podaną jako posiadające poziom API 1 kompatybilności, to dlaczego pojawia się błąd?

Odpowiedz

10

Najwyraźniej to, co się dzieje:

Ponieważ API Level 1, system Android ma już isItemChecked na ListView.

Jednak po wydaniu interfejsu API poziomu 11 firma Google wprowadziła definicję isItemChecked do AbsListView, która jest nadklasą ListView. Ta zmiana nie zapobiega istniejącemu kodowi (przeznaczonemu do kompilacji na poziomie 11 przed API) do kompilacji na poziomie interfejsu API 11, ale wygenerowany plik .class faktycznie szuka isItemChecked na AbsListView, który nie istnieje na urządzeniach z poziomem wstępnym interfejsu API 11 .

Na API Differences Report, jest powiedziane:

boolean isItemChecked(int) Method was locally defined, but is now inherited from AbsListView .

Jest to niebezpieczna pułapka, ponieważ zgodność nie może być sprawdzana na czasie kompilacji w ogóle. Musisz pamiętać, aby przesłać go jako ListView, a nie AbsListView. Być może powinniśmy unikać innych ustawień.

+2

Dokumentacja AbsListView powinna zostać naprawiona. Z pewnością nie został dodany w API 1. To samo dotyczy 'AbsListView.setAdaper', ale oni go zaktualizowali. – xmen

Powiązane problemy