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

Ran*_*ku' 5 android android-framework

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

if (parent instanceof AbsListView) {
    checked = ((AbsListView)parent).isItemChecked(position);
}
Run Code Online (Sandbox Code Playgroud)

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

java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
Run Code Online (Sandbox Code Playgroud)

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

Ran*_*ku' 10

显然这就是发生的事情:

从API Level 1开始,Android框架已经isItemChecked开启ListView.

但是,在API Level 11发布时,Google将定义isItemChecked更改为to AbsListView,这是超类ListView.这种变化并不妨碍现有的代码(专供编译反对-API前的水平11)进行编译API等级11,但是生成的.class文件实际上看起来对isItemCheckedAbsListView,不上-API前的水平11设备上存在.

API差异报告中,声明:

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

这是一个危险的陷阱,因为在编译时根本无法检查兼容性.你必须记住把它投射ListView而不是AbsListView.也许我们应该避免AbsListViewaltogther.

  • 应修复AbsListView文档.它肯定没有在API 1中添加.同样适用于`AbsListView.setAdaper`但他们更新了它. (2认同)