Tôi đã sử dụng một phương pháp lai cho các đoạn chứa chế độ xem danh sách. Nó dường như là hiệu suất vì tôi không thay thế đoạn hiện tại mà chỉ thêm đoạn mới và ẩn đoạn hiện tại. Tôi có phương pháp sau trong hoạt động lưu trữ các đoạn của mình:
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();
}
Tôi sử dụng phương pháp này trong đoạn của mình (chứa chế độ xem danh sách) bất cứ khi nào một mục danh sách được nhấp / gõ (và do đó tôi cần khởi chạy / hiển thị đoạn chi tiết):
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()
trả về một chuỗi các chuỗi mà tôi sử dụng làm thẻ cho các đoạn khác nhau khi tôi thêm một đoạn mới (xem transaction.add
phương thức trongaddFragment
phương thức trên).
Trong đoạn chứa khung nhìn danh sách, tôi thực hiện điều này trong phương thức onPause () của nó:
@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();
}
Sau đó, trong onCreateView của đoạn (thực ra là trong một phương thức được gọi trong onCreateView), tôi khôi phục trạng thái:
// Restore previous state (including selected item index and scroll position)
if(mListViewState != null) {
Log.d(TAG, "Restoring the listview's state.");
lv.onRestoreInstanceState(mListViewState);
}