7

मुझे ViewPager के साथ कोई समस्या है जहां मेरी ListView इसकी स्क्रॉल स्थिति खो रहा है।ViewPager को स्वाइप करते समय FragmentSaveInstanceState पर कॉल नहीं करता है?

ListView के राज्य आसानी से संग्रहित किया जा सकता है और का उपयोग कर बहाल:

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.frag_cool_things, container, false); 

    AdvListView listView = (AdvListView) v.findViewById(R.id.lv0); 
    listView.setOnItemClickListener(mOnListItemClicked); 

    if (null != savedInstanceState) 
    { 
     listView.onRestoreListViewInstanceState(savedInstanceState.getParcelable("list_state")); 
    } 

    mListView = listView; 

    return v; 
} 

@Override 
public void onSaveInstanceState (Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 

    outState.putParcelable("list_state", mListView.onSaveListViewInstanceState()); 
} 

हालांकि समस्या कहा जाता हो जाता है कि जब टुकड़े स्वाइप किया जा रहा है onDestroyView() है, लेकिन onSaveInstanceState (Bundle outState) कॉल कभी नहीं।

स्क्रीन घुमाने और ListView स्थिति को ठीक से पुनर्स्थापित करता है लेकिन स्वाइप करने से मैं यह नहीं समझ सकता कि सूची को कैसे पुनर्स्थापित करना है।

उत्तर

15

अद्यतन 12/17/11:
मैं वास्तव में टुकड़े की सामग्री को बचाने के लिए सही रास्ता मिल गया। आपको FragmentStatePagerAdapter का उपयोग करना होगा। यह एडाप्टर ठीक से टुकड़े की स्थिति बचाता है! :)

पुराने:
खैर मैं यह करने के लिए एक रास्ता मिल गया .. आपके इनपुट को साझा करें यदि आप मानते हैं कि यह कोई एक बहुत बड़ा है नहीं! : पी

यहाँ मेरी FragmentBase वर्ग है कि इस समस्या का समाधान हो रहा है:

public abstract class FragmentBase extends Fragment 
{ 
    private boolean mInstanceAlreadySaved; 
    private Bundle mSavedOutState; 

    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     if (null == savedInstanceState && null != mSavedOutState) { 
      savedInstanceState = mSavedOutState; 
     } 

     mInstanceAlreadySaved = false; 
     return onCreateViewSafe(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onSaveInstanceState (Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     mInstanceAlreadySaved = true; 
    } 

    @Override 
    public void onStop() 
    { 
     if (!mInstanceAlreadySaved) 
     { 
      mSavedOutState = new Bundle(); 
      onSaveInstanceState(mSavedOutState); 
     } 

     super.onStop(); 
    } 

    public abstract View onCreateViewSafe (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); 
} 
+0

मेरा अपना अस्थायी समाधान सिर्फ OnPause() में SharedPreferences को मेरा सामान लिखते हैं, और (OnCreateView में उन्हें वापस पाने के लिए है ...)। हालांकि, आपको साझािकरण (getActivity()। GetSharedPreferences (...)) प्राप्त करने के लिए अटैचिंग गतिविधि तक पहुंचने के लिए मजबूर करता है, और जब गतिविधि टूट जाती है तो आपको अनचाहे सामान को स्पष्ट रूप से हटाने की आवश्यकता हो सकती है (आप जो भी हो भंडारण, कांटा)। उम्मीद है कि किसी के पास बेहतर तरीका है! :) –

+0

कृपया अद्यतन उत्तर देखें :) – Jona

+0

"FragmentPagerAdapter प्रत्येक टुकड़े को अलग कर देगा जब आप सूची के माध्यम से स्वाइप करेंगे, लेकिन उन्हें स्मृति में रखें ताकि जब उपयोगकर्ता वापस स्वाइप हो जाए तो उन्हें आसानी से दोबारा जोड़ा जा सके। यदि आपके पास बड़ी संख्या में टुकड़े हैं, तो FragmentStatePagerAdapter पर विचार करने लायक है क्योंकि यह उन्हें हटा देगा, क्योंकि डाउनसाइड को पुनर्निर्मित करने की आवश्यकता है क्योंकि उपयोगकर्ता उन्हें वापस स्वाइप करता है। इसलिए, यदि आपके पास कम, अधिक जटिल टुकड़े हैं, तो FragmentPagerAdapter समझ में आता है, लेकिन बड़े सेट के लिए FragmentStatePagerAdapter पर विचार करें। " (एंड्रॉइड देव ब्लॉग) –

संबंधित मुद्दे