2015-05-14 2 views
7

Как сохранить позицию прокрутки ListView при выборе одного элемента в ListView, и я хочу вернуться в тот же список ListView.Как сохранить положение прокрутки ListView

Предположим, у нас есть два фрагмента - ListFragment и SomeOtherFragment. Мы заменяем ListFragment на SomeOtherFragment.

FragmentManager manager = getFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 

    transaction.replace(R.id.content_frame, fragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

ответ

9

Лучшее решение, которое я знаю

// Сохранение состояния ListView (= включает в себя положение прокрутки) в качестве Parcelable

Parcelable state = listView.onSaveInstanceState(); 

// Восстановление предыдущего состояния (включая индекс выбранного элемента и прокрутки позиция)

listView.onRestoreInstanceState(state); 

Вы также можете восстановить последнее сохраненное положение даже после установки ИНГ адаптер, как -

// Save the ListView state (= includes scroll position) as a Parceble 
Parcelable state = listView.onSaveInstanceState(); 

// e.g. set new items 
listView.setAdapter(adapter); 

// Restore previous state (including selected item index and scroll position) 
listView.onRestoreInstanceState(state); 

Вы также можете обратиться here для получения более подробной информации.

2

При нажатии на строку ListFragment, сохранить позицию в SharedPreference

<shared_pref_object>.putInt("scroll_position",position); 

Используйте это, когда вы вернетесь из OtherFragment ->ListFragment

<editor_obj>.getInt("scroll_position",0); 

Установить в качестве позиции прокрутки:

listview.setSelection(<editor_obj>.getInt("scroll_position",0)); 
1

Я действительно учусь r почему для этой общей проблемы нет хорошего и оптимизированного решения. Как я понял, все решили по-своему. но я хочу представить свой собственный путь, после попытки все из них:

В ListFragment объявить два Int переменные держать позицию прокрутки:

public static class MyListFragment extends ListFragment { 

     private int listIndex = -1; 
     private int listTop = 0; 

Затем переопределить OnPause() и onResume() для сохранения и восстановить позиции прокрутки в ListView «S следующим образом:

@Override 
public void onResume() { 
     super.onResume(); 

    //after setting adapter and your arbitrary codes 
     if(listIndex!=-1){ 
     this.getListView().setSelectionFromTop(index, top); 
     } 

} 

@Override 
public void onPause() { 
     super.onPause(); 
     try { 
     listIndex = getListView().getFirstVisiblePosition(); 
     View v = getListView().getChildAt(0); 
     listTop = (v != null) ? v.getTop() : 0; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

желание уменьшить боли !! : румянец:

Смежные вопросы