Как решить java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked - PullRequest
5 голосов
/ 05 сентября 2011

Я компилирую проект Android под API Level 11 (3.0), и у меня есть этот код:

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

Когда я запускаю это на устройствах до версии 3.0 (ниже уровня API 11), я получаю эту ошибку:

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

В документации AbsListView , isItemChecked указано, что она имеет совместимость с API уровня 1, тогда почему я получаю ошибку?

1 Ответ

10 голосов
/ 05 сентября 2011

Видимо, так и происходит:

Начиная с уровня API 1, платформа Android уже имеет isItemChecked на ListView.

Однако в выпуске API Level 11 Google переместил определение isItemChecked на AbsListView, который является суперклассом ListView. Это изменение не мешает существующему коду (предназначенному для компиляции на уровне до API уровня 11) компилироваться на уровне API 11, но сгенерированный файл .class фактически ищет isItemChecked на AbsListView, которого не существует на предварительном Устройства API уровня 11.

В отчете о различиях API указано:

boolean isItemChecked(int) Метод был определен локально, но теперь унаследован от AbsListView.

Это опасная ловушка, потому что совместимость вообще не может быть проверена во время компиляции. Вы должны помнить, чтобы использовать его как ListView, а не AbsListView. Может быть, нам следует избегать AbsListView altogther.

...