2010-04-27 16 views

risposta

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

Se uso 'getSharedPreferences', cosa significa che persisterà al disco? cioè conserverà il valore dopo aver riavviato il telefono? Cosa succede se non lo voglio? quando riavvio il telefono, inizierà da 0? – michael

+0

Continuerà oltre lo spegnimento. Se non lo desideri, puoi scrivere il valore su una variabile membro e sperare che persista. Dovrebbe se l'app non ottiene la raccolta dei dati inutili. Hai solo bisogno di decidere da che parte vorresti sbagliare. – CaseyB

+1

Penso che la linea 6 in onPause dovrebbe leggere editor.putInt ("ScrollValue", scroll); – Das

2

Si dovrebbe usare onSaveInstanceState per memorizzare la posizione di scorrimento e quindi utilizzare uno o onCreateonRestoreInstanceState per ripristinarla.

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

+0

Ho provato la tua strada. mListView.getSelectedItemPosition(); restituiscimi un -1 e mListView.getScrollY() dammi uno 0. Sono chiaramente scorrere verso il basso fino al mio ListView quando eseguo il mio test. Qualche idea sul perché non funziona? – michael

+0

Cosa hai fatto per provare la mia strada? – clahey

+0

Ho fatto: protetto void onSaveInstanceState (Bundle outState) { super.onSaveInstanceState (outState); int scroll = mListView.getScrollY(); System.out.println ("scrollY" + scroll); } – michael

27

dichiarare le variabili globali:

int index = 0; 
ListView list; 

e creare un riferimento al vostro ListView in onCreate():

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

successiva, in onResume(), aggiungi questa linea al alla fine:

list.setSelectionFromTop(index, 0); 

Infine, in , aggiungere la seguente riga alla fine:

index = list.getFirstVisiblePosition(); 
+0

Inoltre, salverei l'indice in un oggetto sharedPreferences in modo che quando l'applicazione esce dall'ambito, mantiene comunque l'indice – mray190

+1

@ mray190 che è a cosa serve salvare lo stato dell'istanza. È possibile salvare questo valore in un pacchetto sulle modifiche di orientamento, quindi ripristinare lo stato a scorrimento quando viene ricreata la vista, a livello di attività o frammento. – Phil

2

Si prega di notare che l'uso ListView.getScrollY() NON FUNZIONA BENE per ripristinare la posizione di scorrimento.

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

Si riferisce alla quantità di scorrimento di tutta la vista, in modo che sarà quasi sempre 0.

E 'successo anche a me la maggior parte del tempo che questo valore era 0. ListView.getFirstVisiblePosition() con ListView.setSelection() funziona in modo più affidabile.

7

fare semplice ....

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

e ..

@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

Potrebbe essere stata utile una spiegazione del codice. –

Problemi correlati