如何解决java.lang.NoSuchMethodError:android.widget.AbsListView.isItemChecked

时间:2011-09-05 09:56:18

标签: android android-framework

我正在针对API Level 11(3.0)编译一个Android项目,我有这个代码:

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

当我在3.0之前(低于API级别11)设备运行时,我收到此错误:

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

AbsListView documentation中,isItemChecked被声明为具有API级别1兼容性,那么为什么我会收到错误?

1 个答案:

答案 0 :(得分:10)

显然会发生这种情况:

自API级别1以来,Android框架isItemChecked上已ListView

但是,在API Level 11发布时,Google将isItemChecked的定义移至AbsListView,这是ListView的超类。此更改不会阻止现有代码(用于针对API级别11进行编译)针对API级别11进行编译,但生成的.class文件实际上会在isItemChecked上查找AbsListView,但不会存在于API级别11之前的设备上。

API Differences Report上,声明:

  

boolean isItemChecked(int)方法是本地定义的,但现在继承自AbsListView

这是一个危险的陷阱,因为在编译时根本无法检查兼容性。您必须记住将其转换为ListView而不是AbsListView。也许我们应该避免AbsListView altogther。