তালিকার ভিউযুক্ত টুকরাগুলির জন্য আমি একটি হাইব্রিড পদ্ধতির ব্যবহার করেছি। আমি বর্তমান খণ্ডটি প্রতিস্থাপন করি না বরং নতুন খণ্ড যুক্ত করে বর্তমানটিকে লুকিয়ে রাখি বলে এটি পারফরম্যান্স বলে মনে হচ্ছে। আমার ক্রিয়াকলাপে আমার নিম্নলিখিত পদ্ধতি রয়েছে যা আমার খণ্ডগুলিকে হোস্ট করে:
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();
}
যখনই কোনও তালিকা আইটেম ক্লিক করা / আলতো চাপানো হয় (এবং এভাবে আমার বিবরণ খণ্ডটি প্রদর্শন / প্রদর্শন করা প্রয়োজন) আমি এই পদ্ধতিটি আমার টুকরোটিতে (তালিকার ভিউযুক্ত) ব্যবহার করি:
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()
আমি যখন একটি নতুন টুকরো যোগ করি তখন আমি বিভিন্ন টুকরো জন্য ট্যাগ হিসাবে ব্যবহার করি এমন স্ট্রিংগুলির একটি অ্যারে প্রদান করে ( উপরের পদ্ধতিতে transaction.add
পদ্ধতিটি দেখুন addFragment
)।
তালিকার ভিউযুক্ত ভগ্নাংশে, আমি এটির অনপেজ () পদ্ধতিতে এটি করি:
@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();
}
তারপরে খণ্ডটির অনক্রিটভিউতে (আসলে এমন পদ্ধতিতে যা অনক্রিটভিউতে অনুরোধ করা হয়), আমি রাষ্ট্রটি পুনরুদ্ধার করি:
// Restore previous state (including selected item index and scroll position)
if(mListViewState != null) {
Log.d(TAG, "Restoring the listview's state.");
lv.onRestoreInstanceState(mListViewState);
}