Что заставляет ListView сохранять позицию прокрутки после изменения ориентации?

У меня есть действие, содержащее ListView. Я заполняю представление списка с помощью SimpleCursorAdapter. Когда я запускаю приложение, я могу вручную прокрутить ListView вниз (например, до 10-го элемента). Затем, когда я поворачиваю свой телефон, это уничтожает и воссоздает мою активность, а ListView создается заново, как и ожидалось.

Но на моем телефоне после поворота воссозданная активность показывает мой ListView по-прежнему в моей позиции ручной прокрутки (в этом примере, 10-я строка). Я почти уверен, что мой код не вызывает ListView.setSelection(int), так что вызывает это повторное позиционирование ListView?

Это может показаться довольно удобным, но это не то, что я хочу. Является ли это частью поведения ListViews? Если да, то как остановить/переопределить это повторное позиционирование?


person MickeyR    schedule 06.10.2011    source источник


Ответы (3)


Почитал еще тему....

Состояния просмотра сохраняются автоматически (включая мой ListView). Это обрабатывается реализацией onSaveInstanceState() / onRestoreInstanceState() по умолчанию. Используя отладчик, я вижу, что saveInstanceState включает запись из моего ListView, так что это то, что автоматически перемещает его. Чтобы остановить это в своей деятельности, я могу просто переопределить onSaveInstanceState().

person MickeyR    schedule 07.10.2011

Вы использовали ListActivity в качестве базового класса для своей деятельности? Если да, то, скорее всего, это функция, поскольку она переопределяет onRestoreInstanceState. Я бы попытался наследовать от простой Activity.

person slkorolev    schedule 06.10.2011
comment
Нет, у меня просто стандартная активность, а не ListActivity. - person MickeyR; 07.10.2011
comment
Затем я бы попробовал setSelection в Activity.onCreate и/или в Activity.onRestoreInstanceState. - person slkorolev; 07.10.2011
comment
Я думаю, вы правы, состояние ListView автоматически устанавливается onSaveInstanceState/onRestoreInstanceState. - person MickeyR; 07.10.2011

ListView восстанавливает свое состояние (включая позицию прокрутки) после поворота экрана так же и по той же причине, что например EditText сохраняет введенный вами текст. Так устроен фреймворк Android. Вы можете остановить это поведение сохранения/восстановления, установив атрибут android:saveEnabled="false" для ListView в файле макета xml. Или вы можете вызвать метод setSaveEnabled(false) для ListView для той же цели.

person Sergey    schedule 06.09.2015