Intereting Posts
Андроид, предоставляющий различные доступные ресурсы для ориентации Почему мой onResume называется дважды? Настройки общего доступа или внутреннее хранилище файлов – Любая проблема с памятью? Сделайте определенную часть андроида-textview вправо Отправка файлов с помощью POST с HttpURLConnection Как добавить несколько родных библиотек (.so) в IntelliJ Networkimageview для отображения изображения в автономном режиме? После уничтожения приложения и его повторного открытия. Как и приложение facebook, Поддержка Android-v7-appcompat с 4.0 и выше Как перезагрузить вкладку при изменении вкладки? Не удается получить backspace для работы в codemirror, под Phonegap на Android 4.x? Как правильно разобрать Reddit API на Android Как создать общую папку источника для нескольких проектов в Eclipse? Android Bitmap для Base64 String Как получить доступ к файловой системе другого телефона с помощью bluetooth в Android? Как нарисовать круговую диаграмму в андроиде

Сбой в ListView.removeFooterView (просмотр)

Я получаю отчеты о сбоях

android.widget.ListView lv; lv.removeFooterView(v) 

Ошибка представляет собой исключение из null-указателя. Я проверяю, что listView сам не равен нулю. Что вызывает это? Нужно ли убедиться, что вид, который нужно удалить, не равен нулю? Достаточно ли этого или мне нужно сначала проверить, действительно ли был добавлен вид нижнего колонтитула?

 java.lang.NullPointerException at android.widget.ListView.removeFooterView(ListView.java:374) 

Мне кажется, что этот метод должен быть достаточно устойчивым, чтобы не рухнуть! Почему он не просто возвращает false, если он не может удалить представление?

PS. Я хотел бы знать, видел ли кто-нибудь еще это?

Solutions Collecting From Web of "Сбой в ListView.removeFooterView (просмотр)"

К сожалению, вы не упомянули, какая версия Android сообщает об ошибках. Однако, глядя на исходный код, Android 2.1-update1 кажется хорошим кандидатом.

Я просто скопирую весь метод, чтобы все было ясно:

 public boolean removeFooterView(View v) { if (mFooterViewInfos.size() > 0) { boolean result = false; if (((HeaderViewListAdapter) mAdapter).removeFooter(v)) { // <- line 274 mDataSetObserver.onChanged(); result = true; } removeFixedViewInfo(v, mFooterViewInfos); return result; } return false; } 

Теперь сравните выше removeFooterView(...) с реализацией более поздней платформы:

 public boolean removeFooterView(View v) { if (mFooterViewInfos.size() > 0) { boolean result = false; if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeFooter(v)) { if (mDataSetObserver != null) { mDataSetObserver.onChanged(); } result = true; } removeFixedViewInfo(v, mFooterViewInfos); return result; } return false; } 

Как вы можете видеть, «добавлено в несколько дополнительных проверок для определенных членов, не являющихся null . Это предполагает, что первый метод действительно завершится неудачно в строке 274, если mAdapter == null , в то время как это не приведет к сбою с более новой реализацией.

Чтобы обойти это, все, что вам, вероятно, нужно сделать, это добавить что-то вроде lv.getAdapter() != null прежде чем пытаться удалить нижний колонтитул.

Если вы посмотрите документацию, вы заметите, что это действительно так:

http://developer.android.com/reference/android/widget/ListView.html)

Возвращает

True, если представление было удалено, false, если представление не было просмотром нижнего колонтитула

Таким образом, вы должны добавить нулевую проверку как для представления, так и для listView или если это исключительное состояние (бывает очень редко, а затем обернуть его в блок исключений).