¿Cómo puedo guardar la posición de desplazamiento de ListView?

¿Cómo puedo guardar la posición de desplazamiento de ListView cuando elijo un elemento en ListView, y quiero volver en el mismo ListView.

Supongamos que tenemos dos fragmentos: ListFragment y SomeOtherFragment. Reemplazamos ListFragment con SomeOtherFragment.

FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.replace(R.id.content_frame, fragment); transaction.addToBackStack(null); transaction.commit(); 

3 Solutions collect form web for “¿Cómo puedo guardar la posición de desplazamiento de ListView?”

La mejor solución que conozco

// Guardar el estado ListView (= incluye la posición de desplazamiento) como Parcelable

 Parcelable state = listView.onSaveInstanceState(); 

// Restaurar el estado anterior (incluyendo el índice de elemento seleccionado y la posición de desplazamiento)

 listView.onRestoreInstanceState(state); 

También puede restaurar la última posición guardada incluso después de ajustar el adaptador como –

 // Save the ListView state (= includes scroll position) as a Parceble Parcelable state = listView.onSaveInstanceState(); // eg set new items listView.setAdapter(adapter); // Restore previous state (including selected item index and scroll position) listView.onRestoreInstanceState(state); 

También puede consultar aquí para más detalles.

Al hacer clic en la fila de ListFragment , guarde la posición en SharedPreference

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

Use esto cuando regrese de OtherFragment -> ListFragment

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

Configure esto como posición de desplazamiento:

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

Realmente me pregunto por qué para este problema común no hay una solución buena y optimizada. Como he visto, todos lo han resuelto a su manera. Pero quiero presentar mi propio camino después de probar todos ellos:

En el ListFragment declarar dos int variables para mantener la posición de desplazamiento:

 public static class MyListFragment extends ListFragment { private int listIndex = -1; private int listTop = 0; 

A continuación, anule la onPause () y onResume () para guardar y restaurar las posiciones de desplazamiento de ListView de la siguiente manera:

 @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(); } } 

¡Deseo disminuir los dolores !! :sonrojo:

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.