2015-05-14 15 views
7

Come posso salvare la posizione di scorrimento di ListView quando scelgo una voce in ListView e voglio tornare nello stesso ListView.Come salvare la posizione di scorrimento di ListView

Supponiamo di avere due frammenti: ListFragment e SomeOtherFragment. Sostituiamo ListFragment con SomeOtherFragment.

FragmentManager manager = getFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 

    transaction.replace(R.id.content_frame, fragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

risposta

9

La soluzione migliore che conosco

// salvare lo stato ListView (= include posizione di scorrimento) come Parcelable

Parcelable state = listView.onSaveInstanceState(); 

// Ripristina uno stato precedente (tra cui indice di elemento selezionato e di scorrimento posizione)

listView.onRestoreInstanceState(state); 

È anche possibile ripristinare l'ultima posizione salvata anche dopo l'impostazione ing adattatore come -

// Save the ListView state (= includes scroll position) as a Parceble 
Parcelable state = listView.onSaveInstanceState(); 

// e.g. set new items 
listView.setAdapter(adapter); 

// Restore previous state (including selected item index and scroll position) 
listView.onRestoreInstanceState(state); 

È inoltre possibile fare riferimento here per maggiori dettagli.

2

Quando si fa clic sulla riga della ListFragment, salvare la posizione in SharedPreference

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

Utilizzare questo quando si torna da OtherFragment ->ListFragment

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

insieme questo come posizione di scorrimento:

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

Ho davvero wonde r perché per questo problema comune non esiste una soluzione buona e ottimizzata. Come ho visto, tutti lo hanno risolto a modo loro. ma voglio presentare la mia strada dopo aver provato tutti loro:

All'interno del ListFragment dichiarare due variabili int a tenere la posizione di scorrimento:

public static class MyListFragment extends ListFragment { 

     private int listIndex = -1; 
     private int listTop = 0; 

poi sovrascrivere l'onPause() e onResume() per salvare e ripristinare posizioni di scorrimento s' il ListView come segue:

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

} 

desiderio di diminuire i dolori !! : blush:

Problemi correlati