Android ListView / Адаптер — исключение IllegalStateException при обновлении ArrayList

#android #exception #listview #arraylist #illegalstateexception

#Android #исключение #listview #arraylist #исключение illegalstateexception

Вопрос:

Во-первых, я просмотрел сайт и не смог найти решения своего вопроса, кроме как «скрыть ListView». В моем случае это нежизнеспособное решение!

Итак, проблема: я создал свой собственный «EndlessAdapter», который позволяет мне заполнять ArrayList<>, поддерживая ListView дополнительными данными, когда пользователь прокручивает список до конца списка. Все это работает отлично, за исключением случаев, когда пользователь выбирает строку во время обновления списка или меняет ориентацию во время обновления списка (я полагаю, это может быть любое взаимодействие с пользовательским интерфейсом).

Я завернул свой метод mAdapter.notifyDataSetChanged() в try catch, но, похоже, я никогда не могу поймать это исключение IllegalStateException, поэтому я не знаю, где это происходит!

Есть ли способ, пока адаптер обновляет ListView, заблокировать пользователя от взаимодействия с приложением до его завершения? Длительной частью процесса EndlessAdapter является загрузка новых данных. Обновление ListView — это быстрый процесс, imo.

Мне действительно нужно разобраться с этой проблемой. Я бы предпочел не публиковать исходный код, но при необходимости я могу попробовать опубликовать жизненно важные данные? В противном случае я был бы очень признателен, если бы кто-нибудь с опытом в этом мог пообщаться по электронной почте или IM?

Вот трассировка стека:

04-05 21:11:35.363: ERROR/AndroidRuntime(25707): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(16908298, class android.widget.ListView) with Adapter(class com.mimminito.heatdroid.view.DealsView$DealAdapter)

Вот ссылка на пример моего кода: http://pastebin.com/wfmWSGwQ

Я создаю адаптер в onCreate(). Затем я назначаю адаптер ListView после анализа XML. В том же методе я вызываю метод updateList(). Это возвращает загруженные данные, а затем уведомляет mAdapter о том, что его данные были изменены (все выполняются в потоке пользовательского интерфейса)

Спасибо за ваше время

Адам

Комментарии:

1. Просто мысль — как вы получаете доступ к своим данным в onListItemClicked() ? Я думаю, вы должны получить доступ к соответствующему элементу путем вызова getListView().getItemAtPosition(position) , чтобы избежать проблем с параллелизмом. Кроме того, если вы обнаружите решение по электронной почте или IM, не могли бы вы опубликовать его здесь в любом случае, чтобы другие могли ссылаться на него?

2. Кроме того, если это не код, может помочь публикация трассировки стека.

Ответ №1:

Вы выполняете как добавление в список, так и уведомление в потоке пользовательского интерфейса, как указано? Это единственный способ гарантировать, что список не используется пользовательским интерфейсом и другими вашими потоками одновременно.

Комментарии:

1. Да, я удостоверяюсь, что это происходит. Я попытаюсь вырезать свой личный код и просто добавить элементарные элементы, чтобы вы могли видеть мой поток