Ich habe einen hybriden Ansatz für Fragmente verwendet, die eine Listenansicht enthalten. Es scheint performant zu sein, da ich das aktuelle Fragment nicht ersetze, sondern das neue Fragment hinzufüge und das aktuelle ausblende. Ich habe die folgende Methode in der Aktivität, die meine Fragmente hostet:
public void addFragment(Fragment currentFragment, Fragment targetFragment, String tag) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(0,0,0,0);
transaction.hide(currentFragment);
// use a fragment tag, so that later on we can find the currently displayed fragment
transaction.add(R.id.frame_layout, targetFragment, tag)
.addToBackStack(tag)
.commit();
}
Ich verwende diese Methode in meinem Fragment (das die Listenansicht enthält), wenn auf ein Listenelement geklickt / getippt wird (und daher muss ich das Detailfragment starten / anzeigen):
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
SearchFragment currentFragment = (SearchFragment) fragmentManager.findFragmentByTag(getFragmentTags()[0]);
DetailsFragment detailsFragment = DetailsFragment.newInstance("some object containing some details");
((MainActivity) getActivity()).addFragment(currentFragment, detailsFragment, "Details");
getFragmentTags()
Gibt ein Array von Zeichenfolgen zurück, die ich als Tags für verschiedene Fragmente verwende, wenn ich ein neues Fragment hinzufüge (siehe transaction.add
Methode in addFragment
Methode oben).
In dem Fragment, das die Listenansicht enthält, mache ich dies in der onPause () -Methode:
@Override
public void onPause() {
// keep the list view's state in memory ("save" it)
// before adding a new fragment or replacing current fragment with a new one
ListView lv = (ListView) getActivity().findViewById(R.id.listView);
mListViewState = lv.onSaveInstanceState();
super.onPause();
}
Dann stelle ich in onCreateView des Fragments (tatsächlich in einer Methode, die in onCreateView aufgerufen wird) den Status wieder her:
// Restore previous state (including selected item index and scroll position)
if(mListViewState != null) {
Log.d(TAG, "Restoring the listview's state.");
lv.onRestoreInstanceState(mListViewState);
}