2015-05-14 12 views
7

Wie kann ich die Bildlaufposition der ListView speichern, wenn ich ein Element in ListView auswähle und in derselben ListView zurückkehren möchte?Wie kann ich die Bildlaufposition der ListView speichern?

Angenommen, wir haben zwei Fragmente - ListFragment und SomeOtherFragment. Wir ersetzen ListFragment durch SomeOtherFragment.

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

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

Antwort

9

Die beste Lösung weiß ich

// Speichern Sie die Listview-Zustand (= schließt Position scroll) als Parcel

Parcelable state = listView.onSaveInstanceState(); 

// wiederherstellen vorherigen Zustand (einschließlich ausgewählte Element-Index und blättern Position)

listView.onRestoreInstanceState(state); 

Sie können die zuletzt gespeicherte Position auch nach dem Einstellen wiederherstellen ing-Adapter als -

// 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); 

Sie auch here um weitere Informationen beziehen.

2

Wenn Sie Reihe von ListFragment klicken, um die Position in SharedPreference

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

Verwenden Sie diese speichern, wenn Sie von OtherFragment kommen zurück ->ListFragment

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

Satz dieser als Scroll-Position:

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

Ich wirklich wonde Warum gibt es für dieses allgemeine Problem keine gute und optimierte Lösung? Wie ich gesehen habe, hat jeder es auf seine eigene Weise gelöst. aber ich will meinen eigenen Weg präsentieren, nachdem sie alle versuchen:

Im ListFragment deklarieren zwei int-Variablen die Scroll-Position zu halten:

public static class MyListFragment extends ListFragment { 

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

Dann überschreiben die onPause() und onResume() zu speichern und Wiederherstellung der Positionen ListView ‚s blättern wie folgt:

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

} 

wünschen, um die Schmerzen zu verringern !! : erröten:

Verwandte Themen