Liste görünümü içeren parçalar için karma bir yaklaşım kullandım. Şu anki parçayı değiştirmediğimden ziyade yeni parçayı eklediğimden ve şu anki parçayı gizlediğim için performans sergiliyor gibi görünüyor. Parçalarımı barındıran etkinlikte aşağıdaki yöntem var:
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();
}
Bir liste öğesi tıklatıldığında / dokunduğunda parçamda (liste görünümünü içeren) bu yöntemi kullanırım (ve bu nedenle ayrıntıları parçayı başlatmam / görüntülemem gerekir):
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()yeni bir parça eklediğimde farklı parçalar için etiket olarak kullandığım dizeler dizisini döndürür ( yukarıdaki transaction.addyöntemde addFragmentyönteme bakınız).
Liste görünümünü içeren parça, bunu onun onPause () yönteminde yaparım:
@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();
}
Sonra parçanın onCreateView (aslında onCreateView içinde çağrılan bir yöntemde), ben durumu geri:
// Restore previous state (including selected item index and scroll position)
if(mListViewState != null) {
Log.d(TAG, "Restoring the listview's state.");
lv.onRestoreInstanceState(mListViewState);
}