Доброго времени суток, форумчане!
Создаю мобильное приложение в 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 решил обновиться.
Комментариев нет:
Отправить комментарий