लोडर प्रबंधक कई लोडर के साथ: कैसे सही कर्सर लोडर प्राप्त करें


116

मेरे लिए यह स्पष्ट नहीं है कि यदि आपके पास कई लोडर हैं तो सही कर्सर कैसे प्राप्त करें। कहते हैं कि आप दो अलग-अलग लोडर को परिभाषित करते हैं:

getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);

फिर onCreateLoader () में आप आईडी के आधार पर अलग-अलग काम करते हैं:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

    if (id==0){
               CursorLoader loader = new CursorLoader(getActivity(),
            MaterialContentProvider.CONTENT_URI,null,null,null,null);
    }else{
               CursorLoader loader = new CursorLoader(getActivity(),
            CustomerContentProvider.CONTENT_URI,null,null,null,null);
            };
    return loader;
} 

अब तक तो सब ठीक है। लेकिन onLoadFinished () में सही कर्सर कैसे प्राप्त करें क्योंकि आपको सही Cursoradapter के लिए सही कर्सर की पहचान करने के लिए कोई आईडी नहीं मिलती है।

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {


    mycursoradapter1.swapCursor(cursor);
    if(isResumed()){
        setListShown(true);
    }else {
        setListShownNoAnimation(true);
    }



}
//and where to get the cursor for mycursoradapter2

या मैं गलत हूं और यह एक टुकड़े में दो अलग-अलग कर्सरपैड के लिए परिणाम प्राप्त करने का गलत तरीका है।


यह एक बहुत अच्छा सवाल है! यह अच्छी तरह से पूछा गया है, और एक काफी बारीक विषय पर छूता है। बहुत विशिष्ट है।
कुर्तियां नुसबूम

7
यह उल्लेख किया जाना चाहिए आपको लगता है कि है अलग हैंडलर वर्गों का उपयोग करने, जावा आप एक इंटरफेस (लागू करने के लिए अनुमति नहीं है, जब भी लोडर वापसी प्रकार सभी लोडर भर में एक ही है, सामान्य प्रकार विलोपन के कारण नहीं है के बाद से LoaderCallbacksएक से अधिक के साथ इस मामले में) प्रकार। यह केवल आपके मामले में दोनों समय से काम करता है, परिणाम एक है Cursor
मथायस

1
@ मैथियास ग्रेट आपने इसका उल्लेख किया है! मैं अभी विचार कर रहा हूं कि अलग-अलग रिटर्न प्रकार के साथ 2 लोडर कैसे हैं। तो क्या होगा अगर 2 लोडर 2 अलग रिटर्न प्रकार के साथ? 1 लोडर के साथ एक कार्य करें, दूसरे के बजाय धागे के साथ?
रॉबर्ट

@ रॉबर्ट थ्रेड का उपयोग करने की आवश्यकता नहीं है। आप दो Loaderएस का उपयोग कर सकते हैं । कृपया इस stackoverflow.com/a/20839825/2818583
AnV

जवाबों:


119

लोडर वर्ग में एक विधि है जिसे गेटआईड () कहा जाता है । मुझे उम्मीद है कि यह आपके द्वारा लोडर के साथ जुड़ी आईडी वापस कर देगा।


धन्यवाद, कुर्तियां! ठंडा! मैं यह कोशिश करूँगा, लेकिन उम्मीद है कि यह काम करेगा। मैं एक ही विचार है, लेकिन लोडर वस्तु को नहीं देखा था। इसके बजाय कर्सर वस्तु पर एक नज़र है ...
Kay Gladen

यह Loader.getID () के साथ काम करता है! मैंने अभी इस पर डबलचेक किया है। महान!
काया ग्लेडेन

2
मैं आंतरिक / अनाम कक्षाओं का उपयोग करके ऐसा करने के बारे में सोच रहा हूं, ताकि प्रत्येक लोडर के पास कॉलबैक प्राप्त करने का अपना उद्देश्य हो।
जॉर्ड्स

@ कर्टिसनसुबाम, यह गलत क्यों होगा? आंतरिक गतिविधि बाहरी गतिविधि के साथ नष्ट हो जाती है, इसलिए इसका परिणाम मेमोरी लीक या कुछ भी नहीं होना चाहिए। गतिविधि के एक मजबूत संदर्भ के साथ एक स्थिर वर्ग एक आंतरिक वर्ग के बराबर शब्दार्थ है (जो बाहरी वर्ग के लिए एक अंतर्निहित मजबूत संदर्भ रखता है।)
मैथियास

6
@ जॉर्डन यह तकनीकी रूप से सही है। मैं उस पर बहस नहीं कर रहा हूं। लेकिन जब आप सिर्फ कॉल कर सकते हैं तो यह सब क्यों होता है getId()?
कुर्तिस नुसबम

32

लोडर की getId () विधि का उपयोग करें :

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case 0:
            // do some stuff here
            break;
        case 1:
            // do some other stuff here
            break;
        case 2:
            // do some more stuff here
            break;
        default:
            break;
    }
}    

8

यदि आपके लोडरों के पास सामान्य रूप से परिणाम का कुछ भी नहीं है (यहाँ:) Cursor, तो आप दो अलग-अलग LoaderCallbacksउदाहरण (अपनी गतिविधि / फ्रैगमेंट में दो आंतरिक कक्षाएं) बनाने से बेहतर हैं , प्रत्येक एक लोडर उपचार के लिए समर्पित है, बल्कि संतरे के साथ सेब मिश्रण करने की कोशिश कर रहा है।

आपके मामले में ऐसा लगता है कि डेटा स्रोत और परिणाम उपचार दोनों अलग-अलग हैं, जिससे आपको वर्तमान परिदृश्य की पहचान करने के लिए अतिरिक्त बॉयलरप्लेट कोड लिखना होगा और इसे उपयुक्त कोड ब्लॉक में भेजना होगा।


मेरा एक सवाल है। के प्रयोजन Activityको लागू करने LoaderCallbacksऔर पारित करने thisके लिए getLoaderManager().initLoader()यह सुनिश्चित करें कि है LoaderManagerके बीच संचार चैनल के रूप में कार्य करता है Activityऔर Loaderके माध्यम से LoaderCallbacks। उस संचार चैनल को कैसे बनाया जा रहा है जैसा कि Activityलागू नहीं हो रहा है LoaderCallbacks, बल्कि अनाम आंतरिक कक्षाओं का निर्माण कर रहा है?
13

3
संचार चैनल है LoaderCallbacks। कुछ भी नहीं के Activityरूप में ही उपयोग करने की आवश्यकता है LoaderCallbacks। जब आपको उनकी आवश्यकता हो तो कई संचार चैनल बनाना सरल हो जाता है।
ब्लेडकॉडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.