Как запомнить положение скрола 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
Комментариев нет:
Отправить комментарий