Страницы

Поиск по вопросам

четверг, 6 июня 2019 г.

Одновременная работа и обновление ListView

Доброго времени суток, форумчане! Создаю мобильное приложение в Android Studio. столкнулся с такой проблемой: Принцип работы активности: Отправляется POST запрос на сервер Получаем обратно информацию в JSON формате Обновляем полностью ListView Нужно следующее: Если я прокручиваю список ListView и останавливаюсь на середине списка, то при автоматическом обновлении ListView, я так же должен остаться на середине списка. Реализовано: //создаем адаптер и отправляем ему ArrayList(groups, locations) а так же context(PZakazi.this) ExpListAdapter adapter = new ExpListAdapter(getApplicationContext(), groups, locations, PZakazi.this); adapter.notifyDataSetChanged();
//отключаем видимый Scroll listView.setScrollContainer(false);
//сохраняем положение ListView Parcelable state = listView.onSaveInstanceState();
//обновляем ListView listView.setAdapter(adapter);
//Восстанавливаем положение ListView listView.onRestoreInstanceState(state); Все работает замечательно! но есть НО! Когда происходит ошибка? Если запустить данную активность, и начать шевелить пальцем ListView туда<->сюда, быстро то выбивает следующую ошибку: Ошибка: FATAL EXCEPTION: main 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(2131230815, class android.widget.ExpandableListView) with Adapter(class android.widget.ExpandableListConnector)] Я приблизительно(на 80%) понимаю из-за чего это происходит, но не понимаю как именно исправить это.. Альтернатива: Или возможно есть альтернативный способ обновить ListView, сохранив его позицию? Очень нужна ваша помощь!


Ответ

@Fabien Вы создаете адаптер, потом notifyDataSetChanged, а потом устанавливаете этот адаптер ListView. Декларативно оно все верно, но вот только notifyDataSetChanged должен быть в самом конце. Данная ошибка возникает почти всегда, если кол-во элементов адаптера изменилось (по отношению к ListView. А присвоить адаптер, это почти всегда поменять кол-во элементов), а notifyDataSetChanged не был отправлен до того момента, когда ListView решил обновиться.

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

Отправить комментарий