Ho usato un approccio ibrido per frammenti contenenti una vista elenco. Sembra essere performante poiché non sostituisco il frammento corrente, ma piuttosto aggiungo il nuovo frammento e nascondo quello attuale. Ho il seguente metodo nell'attività che ospita i miei frammenti:
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();
}
Uso questo metodo nel mio frammento (contenente la vista elenco) ogni volta che un elemento dell'elenco viene cliccato / toccato (e quindi ho bisogno di avviare / visualizzare il frammento dei dettagli):
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()
restituisce una matrice di stringhe che utilizzo come tag per frammenti diversi quando aggiungo un nuovo frammento (vedi transaction.add
metodo nel addFragment
metodo sopra).
Nel frammento contenente la vista elenco, lo faccio nel suo metodo onPause ():
@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();
}
Quindi in onCreateView del frammento (in realtà in un metodo invocato in onCreateView), ripristino lo stato:
// Restore previous state (including selected item index and scroll position)
if(mListViewState != null) {
Log.d(TAG, "Restoring the listview's state.");
lv.onRestoreInstanceState(mListViewState);
}