2011-09-05 29 views
5

我對編譯API級別11(3.0)的Android項目,我有這樣的代碼:如何解決java.lang.NoSuchMethodError:android.widget.AbsListView.isItemChecked

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

當我運行這個在前期3.0(低於API級別低11)的設備,我得到這個錯誤:

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

AbsListView documentationisItemChecked表述爲具有API等級1的兼容性,那麼爲什麼我的錯誤?

回答

10

顯然,這是發生了什麼:

由於API等級1,Android框架早已isItemCheckedListView

但是,在發佈API級別11時,Google將isItemChecked的定義移至AbsListView,這是ListView的超類。此更改不會阻止現有代碼(用於編譯預API級別11)針對API Level 11進行編譯,但生成的.class文件實際上在AbsListView上查找isItemChecked,該API在Pre-API Level 11設備上不存在。

API Differences Report,它指出:

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

這是一個危險的陷阱,因爲兼容性不能在編譯時進行檢查的。你必須記得把它當作ListView而不是AbsListView。也許我們應該避免AbsListView altogther。

+2

AbsListView文檔應該修復。這當然不是在API 1中添加的。對於'AbsListView.setAdaper'也是如此,但是它們更新了它。 – xmen