Keine der hier angebotenen Lösungen schien für mich zu funktionieren. In meinem Fall habe ich ein ListView
in einem, Fragment
das ich in einem ersetze FragmentTransaction
, sodass Fragment
jedes Mal, wenn das Fragment angezeigt wird, eine neue Instanz erstellt wird, was bedeutet, dass der ListView
Status nicht als Mitglied des gespeichert werden kann Fragment
.
Stattdessen habe ich den Status in meiner benutzerdefinierten Application
Klasse gespeichert . Der folgende Code soll Ihnen eine Vorstellung davon geben, wie dies funktioniert:
public class MyApplication extends Application {
public static HashMap<String, Parcelable> parcelableCache = new HashMap<>();
/* ... code omitted for brevity ... */
}
public class MyFragment extends Fragment{
private ListView mListView = null;
private MyAdapter mAdapter = null;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mAdapter = new MyAdapter(getActivity(), null, 0);
mListView = ((ListView) view.findViewById(R.id.myListView));
Parcelable listViewState = MyApplication.parcelableCache.get("my_listview_state");
if( listViewState != null )
mListView.onRestoreInstanceState(listViewState);
}
@Override
public void onPause() {
MyApplication.parcelableCache.put("my_listview_state", mListView.onSaveInstanceState());
super.onPause();
}
/* ... code omitted for brevity ... */
}
Die Grundidee ist, dass Sie den Status außerhalb der Fragmentinstanz speichern. Wenn Ihnen die Idee, ein statisches Feld in Ihrer Anwendungsklasse zu haben, nicht gefällt, können Sie dies wahrscheinlich tun, indem Sie eine Fragmentschnittstelle implementieren und den Status in Ihrer Aktivität speichern.
Eine andere Lösung wäre, es in zu speichern SharedPreferences
, aber es wird etwas komplizierter, und Sie müssten sicherstellen, dass Sie es beim Start der Anwendung löschen, es sei denn, Sie möchten, dass der Status über App-Starts hinweg beibehalten wird.
Um zu vermeiden, dass die Bildlaufposition nicht gespeichert wird, wenn das erste Element sichtbar ist, können Sie ein erstes Dummy-Element mit der 0px
Höhe anzeigen . Dies kann erreicht werden, indem Sie getView()
Ihren Adapter wie folgt überschreiben :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if( position == 0 ) {
View zeroHeightView = new View(parent.getContext());
zeroHeightView.setLayoutParams(new ViewGroup.LayoutParams(0, 0));
return zeroHeightView;
}
else
return super.getView(position, convertView, parent);
}