2010-04-27 13 views

Respuesta

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

Si utilizo 'getSharedPreferences', ¿quiere decir que persistirá en el disco? es decir, preservará el valor después de que reinicie el teléfono? ¿Qué pasa si no quiero eso? cuando reinicio el teléfono, comenzará desde 0? – michael

+0

Persistirá más allá del apagado. Si no quiere eso, puede escribir el valor en una variable miembro y esperar que persista. Debería serlo si la aplicación no obtiene basura recolectada. Solo tienes que decidir en qué lado te gustaría equivocarte. – CaseyB

+1

Creo que la línea 6 en onPause debería leer editor.putInt ("ScrollValue", scroll); – Das

2

Debe utilizar onSaveInstanceState para almacenar la posición de desplazamiento y utilizar después onCreate o onRestoreInstanceState para restaurarlo.

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

+0

Intenté su camino. mListView.getSelectedItemPosition(); devuélveme un -1 y mListView.getScrollY() dame 0. Estoy claramente desplazándome hacia abajo a mi ListView cuando hago mi prueba. ¿Alguna idea de por qué no está funcionando? – michael

+0

¿Qué hiciste para probar mi camino? – clahey

+0

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

27

declarar variables globales:

int index = 0; 
ListView list; 

y hacer una referencia a su ListView en onCreate():

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

A continuación, en onResume(), añadir esta línea en el final:

list.setSelectionFromTop(index, 0); 

Por último, en , añadir la siguiente línea al final:

index = list.getFirstVisiblePosition(); 
+0

Además, yo guardaría el índice en un objeto sharedPreferences para que cuando la aplicación salga del alcance, todavía conserve el índice – mray190

+1

@ mray190 que es para qué sirve guardar el estado de la instancia. Puede guardar este valor en un paquete en los cambios de orientación y restaurar el estado desplazado cuando se recrea la vista, en un nivel de Actividad o Fragmento. – Phil

2

Tenga en cuenta que el uso de ListView.getScrollY() no funciona bien para restaurar la posición de desplazamiento.

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

Se refiere a la cantidad de desplazamiento de toda la vista, por lo que casi siempre será 0.

Le pasó a mí también la mayor parte del tiempo que este valor era 0. ListView.getFirstVisiblePosition() con ListView.setSelection() funciona de manera más confiable.

7

hacer sencilla ....

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

y ..

@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

Una explicación del código puede haber ayudado. –

Cuestiones relacionadas