2012-05-22 19 views
8

में पेजर कार्यान्वयन देखने के लिए मुझे एक समाधान की आवश्यकता है। सबसे पहले मैं एकल पृष्ठ में डेटाबेस से विशाल डेटा लोड कर रहा हूं, इसलिए कभी-कभी स्वाइप के दौरान यह स्वाइप आवृत्ति को धीमा कर देता है (आपको पृष्ठ पर कई बार स्वाइप करने की आवश्यकता होती है) पृष्ठभूमि में यह कार्य को प्राप्त कर रहा है। मैं दृश्य लौटने के लिए async कार्य का उपयोग नहीं कर रहा हूं। आलसी लोड पृष्ठों के लिए कोई तरीका है बस उपयोगकर्ता को स्वाइप पर दूसरे पृष्ठ पर जाने की अनुमति दें लेकिन डेटा आलसी भरा हुआ है।एंड्रॉइड लोड डेटा अतुल्यकालिक रूप से पेजर

मेरा कोड नमूना नीचे जैसा है;

public Object instantiateItem(View container, int position) { 

View v; 

v = View.inflate(context,R.layout.swipearea, null); 

listView = (ListView)v.findViewById(R.id.MyListView); 
largeDataCall(); 
((ViewPager)container).addView(v); 
return v; 
} 

मैं इसे बनाने की विधि पर कॉल कर रहा हूं।

pager=(ViewPager) findViewById(R.id.pagerAdapter); 
pager.setAdapter(new SimplePager(MyPager.this)); 
pager.setCurrentItem(364); 

क्या कोई समाधान है?

उत्तर

0

मुझे नहीं लगता कि आपके द्वारा वर्णित सिंक्रोनस फैशन में आलसी लोड डेटा का कोई तरीका है। AsyncTask जाने का तरीका है या शायद आप सीधे धागे का उपयोग कर सकते हैं। मेरा मानना ​​है कि AsyncTask विशेष रूप से इस तरह की कार्यक्षमता के लिए डिजाइन किया गया था। सीधे धागे का उपयोग करना आसान है। यदि आपको कार्यान्वयन पर विचारों की आवश्यकता है, तो देखें: http://geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/

+1

मैं दिए गए लिंक में कोई भी पेज पेजर कार्यान्वयन नहीं देख सकता। – Hanry

+0

पेजर उदाहरण देखने के लिए आप देख सकते हैं: http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html और http://android-developers.blogspot.in/2011/08/horizontal -View-स्वाइप-साथ-viewpager.html। इष्टतम उपयोगकर्ता अनुभव प्राप्त करने के लिए आपको AsyncTask के साथ इस प्रकार के कार्यान्वयन को हुक करने की आवश्यकता है। –

17

मैं फ्रैगमेंट्स (और सीधे विचारों के साथ नहीं) के साथ काम करने का सुझाव दूंगा।

आप अपने टुकड़े पर एक अंतरफलक की जरूरत है उन्हें बताना जब वे दिखाए गए हैं:

public interface IShowedFragment { 

    public void onShowedFragment(); 
} 

अपने सभी टुकड़े कि इंटरफ़ेस को लागू करें, और उस विधि में अपने लोडर/asyncTasks/पृष्ठभूमि कार्य कहते हैं।

फिर अपने व्यूपेजर पर एक ऑन पेज चेंजनर डालें, और जब आप पता लगाते हैं कि उपयोगकर्ता ने पृष्ठ बदल दिया है, तो अपने टुकड़े पर इंटरफ़ेस विधि को कॉल करें। इस श्रोता के साथ आपके पास कुछ विकल्प हैं, जिन तरीकों से आप दृश्य इंटरफ़ेस कॉल को ट्रिगर करने के लिए स्लाइड करने के लिए रोकने के लिए प्रतीक्षा कर सकते हैं।

इस कॉल को बनाने के लिए सही टुकड़ा प्राप्त करने में सक्षम होने के लिए, अपने फ्रैगमेंटएपैडर.स्टैंटिएट इटिम (व्यू ग्रुप, इंट) से टुकड़ा लें जो उस स्थिति के लिए खंड को वापस कर देगा यदि यह पहले से लोड हो चुका है।

mPager.setOnPageChangeListener(new OnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 

     Fragment fragment = (Fragment) mAdapter.instantiateItem(mPager, position); 
     if(fragment instanceof IShowedFragment){ 
      ((IShowedFragment) fragment).onShowedFragment(); 
     } 
    } 
    (...) 
है कि आप खाली विचारों के साथ अपने टुकड़े तैयार कर सकते हैं और जब आप एक पर स्लाइड, आप डेटा लोड करने के लिए शुरू की तरह

+0

क्या आपके पास कोई नमूना कार्यान्वयन है? – Hanry

+3

टुकड़े आपके जीवन को बहुत आसान बना देंगे। यदि आपने उन्हें एक टुकड़े में लागू किया है, तो आप जब भी चाहें डेटा (असीमित रूप से) लोड कर सकते हैं, तो उन्हें Fragment's createView() पर प्रदर्शित करें। http://developer.android.com/reference/android/support/v13/app/FragmentStatePagerAdapter.html – DeeV

+1

कुछ कार्यान्वयन जोड़ा गया है (केवल लापता क्या है एक खंड उदाहरण है, जहांShowedFragment() लागू किया जाएगा और आपके डेटा को अतुल्यकालिक रूप से लोड किया जाएगा) । – galex

1

instantiateItem को तब कहा जाता है जब ViewPager स्वैप करने और दृश्य की आवश्यकता होती है। यह वास्तव में सब कुछ बनाने के लिए नहीं है। मुझे लगता है कि आखिरकार, आलसी लोडिंग खत्म हो गई है। जिस तरह से मैं इसे देखता हूं, वहां दो चीजें हैं जिन्हें आपको यहां करने की आवश्यकता होगी।

1: जब उपयोगकर्ता आपके पृष्ठ तक पहुंचने वाला है तो पृष्ठभूमि में डेटा कैश करें। आपका उदाहरण दावा करता है कि 364 पेज (अच्छे भगवान), इसलिए मैं पेज परिवर्तनों को संभालने के लिए श्रोता का उपयोग कहूंगा। जब आप पृष्ठ 363 पर हों, तो 364 के लिए डेटा लोड करना प्रारंभ करें। जब आप 364 पर हों, तो 365 पर डेटा लोड करना प्रारंभ करें और यदि उपयोगकर्ता वापस स्वैप करना चाहता है तो डेटा 363 पर रखें। यदि डेटा अपेक्षाकृत तेज़ी से लोड हो जाता है या उपयोगकर्ता को स्वैप करने में लंबा समय लगता है, तो यह मानना ​​चाहिए कि आप डेटा लोड करने के लिए asyncTask या थ्रेड का उपयोग कर रहे हैं।

2: बैकअप डिफ़ॉल्ट दृश्य है जो डेटा पुनर्प्राप्त होने तक पॉप्युलेट नहीं होता है। यदि आप डेटा पुनर्प्राप्त करने से पहले उपयोगकर्ता को पृष्ठ लोड करते हैं तो आपको विकल्प 1 के साथ ऐसा करने की आवश्यकता होगी।असल में, बस एक दृश्य है जो "लोड हो रहा है ..." या कुछ आपके पास डेटा होने तक कहता है। या तो, या जब आप इसे प्राप्त करते हैं तो वास्तविक समय पर डेटा को पॉप्युलेट करें। उस स्थिति में उपयोगकर्ता इसे निर्माण देखेंगे।

किसी भी तरह से, मुझे लगता है कि आपको ऐप को अच्छे लगने के लिए कुछ कैश करने की आवश्यकता होगी।

+0

लॉग में मैं देख सकता हूं कि पेजर 363,364,365 के लिए डेटा लोड करना शुरू कर देता है जब मैं वर्तमान आइटम को 364 पर सेट करता हूं।इसलिए पहले लोड के लिए कोई समस्या नहीं है लेकिन उपयोगकर्ता स्वाइप के रूप में, 364 से 365 व्यूपार्जर पृष्ठ 366 के लिए डेटा लोड करना शुरू कर देता है, लेकिन यदि पृष्ठ 366 में डेटा बहुत अधिक है तो मैं देख सकता हूं कि दृश्य कुछ सेकंड के लिए फ्रीज हो जाता है। – Hanry

+0

फिर इसका मतलब है कि आप UI थ्रेड पर तीन अलग-अलग पृष्ठों के लिए डेटा को समेकित रूप से लोड कर रहे हैं, जिनमें से दो भी दिखाई नहीं दे रहे हैं। इसके अलावा, आधा आपका काम किया जाता है। एक थ्रेड का प्रयोग करें और इसे चीजों को महत्वपूर्ण रूप से गति देना चाहिए। – DeeV

+0

यदि आपको उपयोगकर्ता स्वाइप करते समय आपके सभी डेटा पुनर्प्राप्त नहीं किया है, तो आपको अभी भी एक डिफ़ॉल्ट "अभी तक नहीं किया गया" दृश्य की आवश्यकता है। – DeeV

0

क्या आपने android ignition library देखा है? Sample-applications के अनुसार एक घटक "अंतहीन सूची" और एक http-cache घटक है।

मैं इसे अपने आप की कोशिश की नहीं किया है और अगर इस बात के लिए आप बस उदाहरण देखा एक समाधान है न .....

3

मैं सिर्फ एक बहुत समान कार्य पूरा कर लिया है। अपनी समस्या का हल ढूंढने के लिए आपको आरंभ करने के लिए निम्नलिखित बिंदुओं पर विचार करें; पर कि क्या आप की जरूरत है

  1. देखो पहले उदाहरण में है कि डेटा के सभी प्राप्त करते समय किया जाना है। कुछ विवरणों के साथ वापस पोस्ट करने के लिए स्वतंत्र महसूस करें कि आपको किस जानकारी को लोड करने की आवश्यकता है और आप इसके साथ क्या कर रहे हैं (इसे स्क्रीन पर एक सूची के रूप में प्रदर्शित करना?)
  2. CursorLoader एस का उपयोग करके देखें जो भारी उठाने वाले कार्यों को निष्पादित करता है क्योंकि डेटाबेस असीमित रूप से प्राप्त करता है। इंटरवेब्स पर This tutorial सामग्री प्रदाता एंड्रॉइड दृष्टिकोण प्रस्तुत करता है। आधिकारिक एंड्रॉइड यूआरआई और कंटेंटप्रोवाइडर दस्तावेज के साथ खुद को परिचित करने के लिए सर्वश्रेष्ठ अगर उन शर्तों का अधिक मतलब नहीं है।
  3. यदि आप फ्रैगमेंट्स के साथ काम कर रहे हैं - पारंपरिक FragmentPagerAdapter के बजाय FragmentStatePagerAdapter का उपयोग करके देखें। मैंने इस एडाप्टर का उपयोग नहीं किया है, लेकिन मैंने पढ़ा है कि यह केवल वर्तमान में दिखाई देने वाली फ्रैगमेंट को तुरंत चालू करता है, यानी वर्तमान में चयनित टैब के दाईं ओर या बाईं ओर उन टुकड़ों को नहीं।
  4. डीबी के खिलाफ चल रहे क्वेरी को अनुकूलित करने के लिए देखो।
+0

डीईवी के साथ सहमत हैं। यदि प्रत्येक व्यूपेजर, पेज के लिए टुकड़े का उपयोग किया जाता है तो यह कार्य आसान हो जाएगा (और अधिक मानक)। जब फ्रैगमेंट को प्रदर्शित किया जाना है तो क्रिएटिव्यू को बुलाया जाएगा, जहां आप एसिंक डीबी एक्सेस और असीमित यूआई के लिए अपना '' 'कर्सर लोडर''' आदि शुरू कर सकते हैं। यह निश्चित रूप से उपर्युक्त टिप्पणियों के विपरीत संभव है क्योंकि कई अन्य ने इसे किया है। – OceanLife

1

मुझे एक ही समस्या थी। एक दर्शक जो भारी डेटा लोड कर रहा था। यदि आप अक्सर अलग-अलग पृष्ठों के विचारों को बदलने नहीं जा रहे हैं, तो मैं सुझाव दूंगा कि आप पृष्ठों को स्मृति में रखें। आप viewpager स्लाइड पर डेटा ताज़ा करने के लिए चाहते हैं, तो इस

mViewPager.setOffscreenPageLimit(#pages); to keep #pages in memory. I had 5 pages so my #pages was 4. 

प्रदर्शन करने के लिए निम्नलिखित कोड का उपयोग,

mViewPager.getAdapter().notifyDataSetChanged(); with getItemPosition() returning POSITION_NONE. 

का उपयोग और FragmentStatePagerAdapter का उपयोग करें।

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