2010-04-27 2 views
10

Можно создать дубликат:
Maintain/Save/Restore scroll position when returning to a ListViewКак сохранить положение ListView

Как я могу поддерживать позицию моей ListView в моей деятельности, когда я иду на другой вид деятельности (путем запуска другой намерение), а затем вернуться (нажмите кнопку «Назад»)?

спасибо.

ответ

1
@Override 
protected void onPause() 
{ 
    // Save scroll position 
    SharedPreferences preferences = context.getSharedPreferences("SCROLL", 0); 
    SharedPreferences.Editor editor = preferences.edit(); 
    int scroll = mListView.getScrollY(); 
    editor.put("ScrollValue", scroll); 
    editor.commit(); 
} 

@Override 
protected void onResume() 
{ 
    // Get the scroll position 
    SharedPreferences preferences = context.getSharedPreferences("SCROLL", 0); 
    int scroll = preferences.getInt("ScrollView", 0); 
    mListView.scrollTo(0, scroll); 
} 
+0

Если я использую 'getSharedPreferences', это означает, что она будет сохраняться на диск? т. е. он сохранит значение после перезагрузки телефона? Что, если я этого не хочу? когда я перезагружу телефон, он начнется с 0? – michael

+0

Он будет сохраняться после выключения. Если вы этого не хотите, вы можете написать значение переменной-члену и надеяться, что оно сохранится. Это должно быть, если приложение не получает сбор мусора. Вам просто нужно решить, с какой стороны вы хотите ошибиться. – CaseyB

+1

Я думаю, что строка 6 в onPause должна читать editor.putInt («ScrollValue», прокрутка); – Das

2

Вы должны использовать onSaveInstanceState, чтобы сохранить позицию прокрутки, а затем использовать либо onCreate или onRestoreInstanceState, чтобы восстановить его.

http://developer.android.com...#onSaveInstanceState ...

+0

Я пробовал свой путь. mListView.getSelectedItemPosition(); верните мне -1 и mListView.getScrollY() дает мне 0. Я, очевидно, прокручиваю вниз до своего ListView, когда я делаю свой тест. Любая идея, почему она не работает? – michael

+0

Что вы сделали, чтобы попробовать свой путь? – clahey

+0

Я сделал: защищенный void onSaveInstanceState (Bundle outState) { super.onSaveInstanceState (outState); int scroll = mListView.getScrollY(); System.out.println ("scrollY" + прокрутка); } – michael

27

Объявляет глобальные переменные:

int index = 0; 
ListView list; 

и сделать ссылку на ваш ListView в onCreate():

list = (ListView) findViewById(R.id.my_list); 

Далее, в onResume(), добавьте эту строку в конец:

list.setSelectionFromTop(index, 0); 

Наконец, в , добавьте следующую строку в конец:

index = list.getFirstVisiblePosition(); 
+0

Кроме того, я бы сохранил индекс в объекте sharedPreferences, чтобы при выходе приложения из области действия он по-прежнему сохранял индекс – mray190

+1

@ mray190, который это сохранение состояния экземпляра. Вы можете сохранить это значение в пакете при изменении ориентации, а затем восстановить состояние прокрутки при воссоздании представления на уровне активности или фрагмента. – Phil

2

Пожалуйста, обратите внимание, что при использовании ListView.getScrollY() не работает хорошо для восстановления позиции прокрутки.

Android: ListView.getScrollY() - does it work? См

Это касается количества прокрутки всей точки зрения, так что почти всегда будет 0.

Это случилось со мной тоже большую часть времени, что это значение было 0. ListView.getFirstVisiblePosition() с ListView.setSelection() работает более надежно.

7

ли простой ....

@Override 
protected void onPause() 
{ 
    index = listView.getFirstVisiblePosition(); 
    // store index using shared preferences 
} 

и ..

@Override 
public void onResume() { 
super.onResume(); 
// get index from shared preferences 

if(listView != null){ 
    if(listView.getCount() > index) 
     listView.setSelectionFromTop(index, 0); 
    else 
     listView.setSelectionFromTop(0, 0); 
} 
+1

Возможно, объяснение этого кода помогло. –

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