2012-06-11 11 views
6

मेरे पास मासिक कैलेंडर दिखाने के लिए ViewPager और GridView है। GridView में लगभग 30 तत्व हैं और बाएं और दाएं स्वाइप करें बहुत धीमी है। मैंने किसी भी डेटाबेस पहुंच के बिना परीक्षण करने के लिए नमूना प्रोजेक्ट बनाया है और यह भी धीमा है। शायद कोई समस्या देखता है या क्या मुझे पृष्ठों का एसिंक्रोनस लोड करना है?30 तत्वों के साथ ViewPager और GridLayout क्यों धीमे हैं?

GridView में एक तत्व के लिए यह लेआउट है। मैं किसी भी तत्व में 9 छोटे 5x5 पिक्सेल आइकन दिखाना चाहता हूं, लेकिन उनके बिना, यह भी धीमा है।

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/Layout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:padding="1dp"> 
    <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> 
    <TextView android:id="@+id/date" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginLeft="5dp" android:gravity="center_vertical" android:textSize="14sp" android:textStyle="bold"/> 
    </LinearLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot1" android:layout_width="wrap_content" android:drawingCacheQuality="auto" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:background="#ffffff" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:paddingBottom="1dp" android:paddingLeft="1dp" android:paddingTop="5dp"/> 
    </RelativeLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/> 
    </RelativeLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="right" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/> 
    </RelativeLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_gravity="center_horizontal" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/> 
    </RelativeLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_gravity="left" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/> 
    </RelativeLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="left" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/> 
    </RelativeLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="left" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/> 
    </RelativeLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_gravity="left" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/> 
    </RelativeLayout> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> 
    <ImageView android:id="@+id/dot9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="left" android:background="#ffffff" android:paddingBottom="5dp" android:paddingLeft="1dp"/> 
    </RelativeLayout> 
</LinearLayout> 

GridView एडाप्टर के instantiateItem है कि:

public Object instantiateItem(ViewGroup container, int position) { 
    GridView gv = new GridView(m_context); 
    gv.setAdapter(new BaseAdapter() { 
     @Override 
     public View getView(int pos, View convertView, ViewGroup parent) { 
      View v; 
      if (convertView == null) { 
       // if it's not recycled, initialize some attributes 
       v = mInflater.inflate(R.layout.calendar_month_item, null); 
      } else { 
       v = convertView; 
      } 
      TextView dayView = (TextView) v.findViewById(R.id.date); 
      dayView.setText(pos + ""); 
      return v; 
     } 

     @Override 
     public long getItemId(int p) { 
      return 0; 
     } 

     @Override 
     public Object getItem(int p) { 
      return null; 
     } 

     @Override 
     public int getCount() { 
      return 30; 
     } 
    }); 
    gv.setNumColumns(5); 
    ((ViewPager) container).addView(gv); 
    return gv; 
} 
+4

आपकी बाधाओं को कहां झूठ बोलने के लिए ट्रेसव्यू का उपयोग करें। – CommonsWare

+0

मैंने ट्रेसेव्यू में देखा लेकिन मैं नहीं देख सकता कि समस्या कहां है, इसका एकमात्र यूआई प्रतिनिधित्व है। – MOST2K2

+2

आप रिलेवेटिवआउट के अंदर छवि दृश्यों को लपेट रहे हैं और आपके टेक्स्ट व्यू को लाइनरलेआउट के अंदर लपेट रहे हैं: यह पूरी तरह से अनावश्यक है। दूसरा, आपके पास एकाधिक ग्रिड व्यू हैं ... क्या आपके पास एकाधिक एडाप्टर हैं? आपको सभी एडेप्टर की आवश्यकता नहीं है। आप सब कुछ एक एडाप्टर में प्रबंधित कर सकते हैं! अंत में, बस सोचते हुए, आपको ViewPager की आवश्यकता नहीं है। सरल एनिमेशन के साथ आप इस काम को एक ग्रिड व्यू (और प्रत्येक एडाप्टर रीसेट हर बार) के साथ बना सकते हैं। शुभकामनाएं –

उत्तर

5

मैं थोड़ा के लिए चारों ओर देखा और मैं मैंने पाया आप के लिए वास्तव में क्या देख रहे हैं लगता है:

  • content XML, तो आप शायद बदलने के लिए या अपने लेआउट फिर से करना के रूप में यह है काफी बड़ी पता चला है के लिए, आप के रूप में होगा कहा हुआ।
  • CalendarAdapter.java, लाइन 112 में आप देख सकते हैं कि उन्होंने वहां एक आइकन जोड़ा है। बस कोड को चारों ओर बदलें ताकि आप इन सभी लेआउट के बजाय अपने नौ आइकन प्रोग्रामेटिक रूप से जोड़ सकें।
  • How to implement CalendarView in Android
+0

हां मैं इस परियोजना को जानता हूं। लेकिन मुझे ग्रिडव्यू के एक आइटम में 9 आइकन (और उन्होंने सक्षम/अक्षम राज्य) की आवश्यकता है, इसलिए मैं उन्हें इस समय प्रोग्रामेटिक रूप से जोड़ता हूं। शायद मैं उन्हें लेआउट में डालूं और आवश्यक लोगों को दिखाऊंगा और दूसरों को छुपाऊंगा। अगर मैं ग्रिडव्यू के साथ व्यूअर को गति देता हूं तो मैं फिर से पोस्ट करूंगा। – MOST2K2

+0

मैंने इसे फिर से देखा है और मुझे लगता है कि आपको पहले जो कहा था उसके साथ रहना चाहिए। हालांकि कैलेंडर के "महीने दृश्य" में इन सभी आइकनों को प्रदर्शित करने के बजाय, आपको केवल एक आइकन प्रदर्शित करना चाहिए यदि उस दिन में कोई आइकन शामिल है। फिर जब आप "महीने दृश्य" में दिन चुनते हैं तो यह उस दिन के एक संवाद को पॉप अप करेगा जिसमें उस दिन के सभी आइकन शामिल होंगे। इसका आसान क्लीनर और बहुत तेज़ काम करता है। इसके अलावा आप उन सभी दिनों को स्टोर करने के लिए SQLite DB का उपयोग करने का प्रयास कर सकते हैं जिनमें आइकन हैं और उनमें कौन से आइकन हैं। इसके बाद आपके पास 'सूची करने के लिए' या जो कुछ भी हो, उसके कई विकल्प होंगे। – CommonKnowledge

+0

@ MOST2K2 जो मैंने ऊपर वर्णित किया है, उसमें आप एक कस्टम संवाद का उपयोग कर सकते हैं और इसकी अपनी एक्सएमएल फ़ाइल होगी। – CommonKnowledge

2

एंड्रॉयड का कौन सा संस्करण उपयोग करते हैं? यह महत्वपूर्ण है, क्योंकि एंड्रॉइड 3.0 में कैलेंडर है, इसमें बग है, लेकिन इतना महत्वपूर्ण नहीं है।

आपके प्रश्न के बारे में, अगर मैं इसे अच्छी तरह समझ गया। अपने एक्सएमएल को देखें, इसमें 11 लेआउट हैं, और यह केवल एक तत्व के लिए है। यदि आपके पास बहुत से लोग हैं, तो कल्पना करें कि आपके सभी तत्वों को बढ़ाने के लिए एंड्रॉइड सिस्टम को कितना काम करना चाहिए। और उसके बाद, जब आप स्वाइप करते हैं, तो आप तत्वों का पुन: उपयोग करते हैं, और एंड्रॉइड को उन लोगों को रीफ्रेश करना चाहिए जो वैध नहीं हैं। यह बहुत काम है। (11 लेआउट * 30 = 330 लेआउट रीफ्रेश या फुलाए जाने के लिए)। जैसा कि एंड्रॉइड डेवलपर प्रलेखन कहता है, आपको हमेशा अपने तत्वों को लपेटने के लिए कम लेआउट के रूप में उपयोग करना चाहिए, जितना संभव हो!

वैसे भी, आपका दृष्टिकोण सही नहीं है। मैं आपको एंड्रॉइड 3+ में कैलेंडरव्यू के स्रोत कोड को देखने के लिए सुझाव दे सकता हूं, लेकिन आपको एक संकेत देने के लिए:

एक सप्ताह के लिए एक लेआउट बनाएं, न कि हर दिन (जैसे कैलेंडरव्यू में)। ऐसा करने से, एंड्रॉइड को केवल एन तत्वों को रीफ्रेश करना होगा (आप चुन लेंगे कि आप कितने हफ्तों को एक पल में प्रदर्शित करना चाहते हैं), 30 नहीं। इस लेआउट में हर दिन 7 विचार होना चाहिए।

आशा है कि आपको इससे कुछ विचार मिलेगा।

+0

मैं अपने सैमसंग गैलेक्सी नेक्सस में एंड्रॉइड 4.0.4 का उपयोग करता हूं। लेकिन मैं एपीआई स्तर> 8 (2.2.x) के लिए अपना ऐप चलाने के लिए चाहता हूं, मैं आंतरिक कैलेंडर का उपयोग नहीं करता, यह मेरा अपना कार्यान्वयन है। हां यह सच है 330 लेआउट बहुत काम है, और यह हर महीने के लिए है। मेरे पास एक सप्ताह और दिन का परिप्रेक्ष्य भी है। बाएं या दाएं स्वाइप करते समय ये बहुत तेज़ होते हैं। मैं लेआउट को कम करने की कोशिश करता हूं और मुझे उम्मीद है कि यह काम कर रहा है। हो सकता है कि मैं टुकड़ों में बदलूं और पृष्ठों का एक ansynchronous लोड करें। – MOST2K2

+0

यदि कोई कैलेंडर पहले से मौजूद है तो कुछ क्यों आविष्कार करें? उदाहरण के लिए मुझे एंड्रॉइड कैलेंडर की हर पंक्ति पर कुछ मंडलियां खींचने की आवश्यकता थी। मैंने इस कैलेंडर के स्रोत कोड को डाउनलोड किया, और कुछ लाइनों को बदल दिया, और यह काम करता है। मैंने 2.2 पर इसका परीक्षण नहीं किया, हालांकि केवल 3+। – XMight

+0

मैं शिक्षकों के लिए कक्षा पुस्तक के लिए अपने कैलेंडर का उपयोग करता हूं, यह केवल 1-10 घंटे के साथ बहुत विशिष्ट है। – MOST2K2

0

सबसे पहले, अपने लेआउट के रूप में दूसरों ने कहा है, थोड़ा अजीब है।

  • आपको वास्तव में किसी लेआउट उप तत्वों के लिए स्कीमा की आवश्यकता नहीं है।
  • आवश्यकता होने पर एकाधिक नेस्टेड रिश्तेदार या रैखिक लेआउट होने पर काफी महंगा होगा, खासकर जब एक ViewPager में लिपटे ग्रिड व्यू में लपेटा जाए।

दूसरा, व्यूपेजर और पेजर एडाप्टर थोड़ा मुश्किल है।

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

@ कॉमन्सवेयर की सलाह के साथ जाकर शायद एक अच्छा विचार है। TraceView का उपयोग करना थोड़ा मुश्किल है, लेकिन यहां तक ​​कि यह शायद कुछ सुराग पैदा करेगा।

+0

हाँ यह सच है कि मुझे ऐसे उप तत्वों की आवश्यकता नहीं है। मैं 3 के डिफ़ॉल्ट ऑफस्क्रीन पेजों को नहीं बदलता हूं और हटाएं IViewFromObject सही ढंग से कार्यान्वित किया गया है। – MOST2K2

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