Страницы

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

вторник, 13 ноября 2018 г.

ListView, запомнить/восстановить положение скрола

Как запомнить положение скрола ListView и восстановить их при следующем возврате на активити с ним?


Ответ

Лично я считаю наиболее оптимальным следующий способ (подходит для поворотов устройства и переходов по стеку в пределах одного запуска приложения):
Parcelable state;
@Override public void onViewCreated(final View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); listView.setAdapter(adapter); ... if(state != null) { listView.onRestoreInstanceState(state); } }
@Override public void onPause() { state = listView.onSaveInstanceState(); super.onPause(); }
То есть мы используем методы сохранения и востановления состояния списка, которые специально предназаначены для этого.
Если требуется долгосрочное хранение (например, запомнить позицию после выхода из приложения), то можно использовать следующий способ:
SharedPreferences pref;
@Override public void onResume() { super.onResume();
pref = PreferenceManager.getDefaultSharedPreferences(this); mList.setSelectionFromTop(pref.getInt("index",0), pref.getInt("top",0)); }
@Override public void onPause() {
int index = mList.getFirstVisiblePosition(); View v = mList.getChildAt(0); int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());
pref = PreferenceManager.getDefaultSharedPreferences(this); Editor edit = pref.edit(); edit.putInt("index", index); edit.putInt("top", top); edit.apply();
super.onPause(); }
То есть, здесь мы перед выходом из активити получаем позицию, в которой находится ListView и сохраняем ее в SharedPrefrences для долгосрочного хранения, затем восстанавливаем при (пере-)запуске активити сохраненную позицию в списке.
Другие варианты решения enSO

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

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