2011-10-12 10 views
16

अद्यतन करने के लिए समस्याएं Fragments की गतिशील सूची प्रदर्शित करने के लिए के साथ FragmentActivity का उपयोग करने का प्रयास कर रहा हूं। इसके एक स्थिर संस्करण को कैसे करें इस पर बहुत सारे उदाहरण हैं। मेरी समस्या यह है कि जिस सूची को मैं प्रदर्शित करता हूं उसे गतिशील रूप से लोड करने की आवश्यकता होती है और उपयोगकर्ता इनपुट (जोड़ें/हटाएं) के आधार पर भी बदल सकती है। मैं अपनी सूची बनाने के लिए उपयोग किए जा सकने वाले डेटा के सेट को लोड करने के लिए अनुकूलित android.support.v4.content.Loader का उपयोग करने का प्रयास कर रहा हूं। जब तक मैं बात करने के लिए मिलता हैएंड्रॉइड - FragmentActivity + लोडर का उपयोग FragmentStatePagerAdapter

सब कुछ मेरी सेटअप में ठीक हो जाता है जब मैं अनुकूलक का अद्यतन करें और FragmentStatePagerAdapter#notifyDataSetChanged() कॉल और इस बिंदु पर इस कोड (FragmentStatePagerAdapter से) निष्पादित किया जाता है

public void finishUpdate(View container) 
{ 
    if(mCurTransaction != null) 
    { 
     mCurTransaction.commit(); // BANG!!! The exception is thrown 
     mCurTransaction = null; 
     mFragmentManager.executePendingTransactions(); 
    } 
} 

लेन-देन के लिए प्रतिबद्ध के साथ विफल जारी करने के लिए चाहते हैं इस संदेश:

java.lang.IllegalStateException: Can not perform this action inside of onLoadFinished

क्योंकि FragmentManagerImpl के भीतर इस कोड निष्पादित होने

private void checkStateLoss() { 
    if (mStateSaved) { 
     throw new IllegalStateException(
       "Can not perform this action after onSaveInstanceState"); 
    } 
    if (mNoTransactionsBecause != null) { 
     throw new IllegalStateException(
       "Can not perform this action inside of " + mNoTransactionsBecause); 
    } 
} 

ऐसा लगता है कि mNoTransactionsBecause मान शून्य नहीं है और जब परिणाम मैं किसी भी तरह transaction.commitAllowingStateLoss() लेकिन सब कुछ संबंधित करने के लिए tramsaction.commit() बदलने का प्रयास कर विभिन्न चर देख रहा था onLoadFinished

को वापस लौटा दिया जाता है यह LoaderManagerImpl.LoaderInfo में सेट किया गया है लेनदेन के लिए निजी या कम से कम पैकेज संरक्षित प्रतीत होता है।

क्या कोई मुझे सामान्य विचार दे सकता है अगर मैं ऐसा कर सकता हूं जो मुझे करना है (और कैसे)?

बस इतना ध्यान रखें कि मेरे कोड ठीक काम करता है, तो बजाय लोडर का उपयोग करने का मैं AsyncTask

में
+0

आप एक लोडर के साथ ऐसा करना उचित तरीके से यह पता लगाने के लिए सक्षम गया है? मुझे एक ही समस्या का सामना करना पड़ रहा है। मैं 'banking.commitAllowingStateLoss()' का उपयोग करके इसे काम करने में सक्षम था, लेकिन यह जानना अच्छा होगा कि Google ने हमें क्या करना है ... ऐसा लगता है कि डेटा लोड करने के बाद एक खंड लेनदेन करने का कोई तरीका होना चाहिए लोडर का उपयोग करके ... – ashughes

+0

मैंने आम तौर पर इसे छोड़ दिया और सीमित पूलिंग – Bostone

+0

के साथ आधुनिक टास्कलोडर का उपयोग कर रहा हूं ModernTaskLoader क्या है? कहीं भी इसके बारे में कोई जानकारी नहीं मिली ... – ashughes

उत्तर

35

मुझे इस तरह की एक बहुत ही समस्या थी और इसे फ्रैगमेंट पर हैंडलर का उपयोग करके हल किया गया।

मैं onLoadFinished(), निम्नलिखित

public class MyFragment extends Fragment 
    implements LoaderManager.LoaderCallbacks<T> { 

    public void onLoadFinished(Loader<T> loader, T data) { 
     showDialog(); 
    } 

    public void showDialog() { 
     MyAlertDialogFragment fragment = new MyAlertDialogFragment(); 
     fragment.show(getActivity().getSupportFragmentManager(), "dialog"); 

    } 
} 

के समान पर एक चेतावनी संवाद दिखाना चाहते थे लेकिन इस

की onLoadFinished

अंदर यह कार्य नहीं कर सकते हैं एक त्रुटि दे दी है समाधान

संवाद दिखाने की देखभाल करने के लिए टुकड़े में एक हैंडलर जोड़ना था

और फिर हैंडलर के लिए एक संदेश भेजने के लिए onLoadFinished (...) को संशोधित करने के बजाय

public void onLoadFinished(Loader<T> loader, T data) { 
     handler.sendEmptyMessage(MSG_SHOW_DIALOG); 
    } 
+11

या आप हैंडलर पर एक रननेबल पोस्ट करते हैं। 'हैंडलर एच = नया हैंडलर (Looper.getMainLooper()); h.post (नया रननेबल() {....}); 'आदि –

+1

@ क्रिस। जेनकींस इयान का कार्यान्वयन अधिक कुशल है क्योंकि इसे केवल एक ऑब्जेक्ट आवंटन की आवश्यकता है। :) –

+0

@AlexLockwood वास्तव में एक मुद्दा नहीं है जब तक कि आप एक उच्च प्रदर्शन परिदृश्य में एक हिट में 1000 वस्तुओं का निर्माण नहीं कर रहे हैं। –

0

लोड हो रहा है ऑप्स चलाने आप FragmentStatePagerAdapter कॉपी कर सकते हैं और जैसे आप चाहें इसे बदलने, या अपने स्वयं PagerAdapter खरोंच से बनाने के लिए। या बस लोडर का उपयोग न करें।

+0

एडाप्टर के साथ यह समस्या नहीं है, यह सब कर रहा है - लेनदेन कर रहा है। लेकिन कोई भी लोडफिनिश पर लेनदेन करने के लिए काफी प्रयास करने गया। मैं जानना चाहता हूं क्यो? मुझे एक पंक्ति के लिए कक्षाओं को फिर से लिखना पसंद नहीं है और मुझे लोडर अवधारणा पसंद है और इसका उपयोग करना चाहते हैं। जैसा कि मैंने कहा - मेरे पास AsyncTask – Bostone

+4

का उपयोग करके सीधे कार्यान्वयन कार्य कर रहा है जाहिर है क्योंकि 'ऑनलोड लोड() 'में कॉल करते समय राज्य हानि की कुछ संभावना है। जावाडॉक से: 'ध्यान दें कि इस कॉल में सामान्य रूप से किसी एप्लिकेशन को खंड लेनदेन करने की अनुमति नहीं है, क्योंकि गतिविधि के राज्य को सहेजने के बाद ऐसा हो सकता है। इस पर और चर्चा के लिए FragmentManager.openTransaction() देखें। 'आपको प्रतिबद्धता में बदलना होगा' commitएलोइंगस्टेट लॉस() 'या लोडर स्क्रैप करें। मुझे एक ही समस्या थी, और यहां मुझे जवाब मिला: https://groups.google.com/forum/#!topic/android-developers/dXZZjhRjkMk/discussion –

0

यह rootView.post का उपयोग कर काम करता है()। बस क्लास स्कोप में रूट व्यू वैरिएबल को परिभाषित करें और फिर इसे क्रिएटिव्यू() पर बढ़ाएं। अंत में onLoadFinished() बस इस तरह इसका इस्तेमाल:

  rootView.post(new Runnable() { 
       public void run() { 
        General.showFragment(); 
       } 

      }); 
संबंधित मुद्दे