Страницы

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

вторник, 17 марта 2020 г.

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

#android #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, сохранив его позицию? 
Очень нужна ваша помощь!    


Ответы

Ответ 1



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

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

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