2010-04-27 16 views

Odpowiedz

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

Jeśli używam 'getSharedPreferences', to znaczy będzie się utrzymywać na dysku? tj. zachowa wartość po ponownym uruchomieniu telefonu? Co jeśli nie chcę tego? kiedy ponownie uruchomię telefon, rozpocznie się od 0? – michael

+0

Zostanie zachowane po wyłączeniu. Jeśli tego nie chcesz, możesz zapisać wartość zmiennej członkowskiej i mieć nadzieję, że będzie się powtarzał. Powinno to, jeśli aplikacja nie zbiera śmieci. Musisz tylko zdecydować, którą stronę chcesz popełnić. – CaseyB

+1

Myślę, że wiersz 6 w onPause powinien przeczytać editor.putInt ("ScrollValue", scroll); – Das

2

Należy użyć onSaveInstanceState aby zapisać pozycję przewijania, a następnie użyć albo onCreate lub onRestoreInstanceState go przywrócić.

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

+0

Próbowałem twojej drogi. mListView.getSelectedItemPosition(); zwróć mi -1 i mListView.getScrollY() daj mi 0. Jestem wyraźnie przewijany do mojego ListView kiedy wykonuję test. Każdy pomysł, dlaczego to nie działa? – michael

+0

Co zrobiłeś, aby spróbować? – clahey

+0

Zrobiłem: chronione void onSaveInstanceState (pakiet outState) { super.onSaveInstanceState (outState); int scroll = mListView.getScrollY(); System.out.println ("scrollY" + przewijanie); } – michael

27

deklarować zmienne globalne:

int index = 0; 
ListView list; 

i odwołuje się do swojej ListView w onCreate():

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

Następnie w onResume(), dodać tę linię na koniec:

list.setSelectionFromTop(index, 0); 

Wreszcie w , dodaj następującą linię na końcu:

index = list.getFirstVisiblePosition(); 
+0

Co więcej, zapisałbym indeks w obiekcie sharedPreferences tak, że gdy aplikacja wykracza poza zakres, nadal zachowuje indeks – mray190

+1

@ mray190, który jest to, do czego służy zapisanie stanu instancji. Możesz zapisać tę wartość w pakiecie ze zmianami orientacji, a następnie przywrócić przewijany stan po odtworzeniu widoku na poziomie Aktywności lub Fragmentu. – Phil

2

Należy pamiętać, że używanie ListView.getScrollY() nie działa dobrze dla przywrócenia stanowiska przewijania.

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

Jest odnosząc się do ilości przewijania całego widoku, więc będzie prawie zawsze 0.

Zdarzyło mi się też przez większość czasu, że wartość ta był 0. ListView.getFirstVisiblePosition() z ListView.setSelection() działa bardziej niezawodnie.

7

Wykonaj proste ....

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

i ..

@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

Objaśnienie kodu mogło pomóc. –

Powiązane problemy