2012-09-21 13 views
5

सेट है यह मेरा सेटअप है। मेरे पास कुछ फैंसी हेडर के साथ एक कस्टम ListView है, जो ViewPager के अंदर है। मैं छवियों की स्मृति कैश को बनाए रख रहा हूं जिसे किसी भी आत्म-सम्मानित डेवलपर की तरह स्थानीय रूप से डाउनलोड और संग्रहीत किया जा रहा है।हर समय छवि से बचें और ऑनआउट करें ImageView बिटमैप

मुद्दा मैं आ रही है, कि हर मैं अपने ListView के getView() विधि में ImageView पर setImageBitmap(Bitmap bm) कहते कैश से एक बिटमैप का उपयोग कर, यह onMeasure() करने के लिए अपने सभी दृश्य पैदा कर रहा है। मैं एंड्रॉयड ImageView स्रोत कोड के माध्यम से देखा और यह मिल गया है:

public void setImageDrawable(Drawable drawable) { 
    if (mDrawable != drawable) { 
     mResource = 0; 
     mUri = null; 

     int oldWidth = mDrawableWidth; 
     int oldHeight = mDrawableHeight; 

     updateDrawable(drawable); 

     if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) { 
      requestLayout(); 
     } 
     invalidate(); 
    } 
} 

तो मैं देख सकता हूँ कि setImageDrawable (जो setImageBitmap द्वारा कहा जाता है) drawable अपने पिछले Drawable से आयाम भिन्न है जब भी अपने लेआउट अनुरोध करता है। समस्या यह है कि मेरा ImageView स्थिर है जो 60 डीपी x 60 डीपी तक स्थिर है, इसलिए इसका आकार उसकी छवि के आकार के बावजूद बदलने वाला नहीं है।

क्या मैं स्क्रॉल के रूप में लगातार लेआउट के आसपास ले जा सकता हूं? onMeasure और onLayout कॉल View पेड़ को अपना रास्ता प्रसारित कर रहे हैं, इसलिए मेरा ListView और ViewPager भी सूची स्क्रॉलिंग के बीच में मापा जा रहा है, जो स्पष्ट रूप से गंभीर प्रदर्शन समस्याओं (~ 100ms UI कूदता है) का कारण बन रहा है।

प्रदर्शन भयानक है और मुझे इसे ठीक करने की आवश्यकता है। किसी के पास कोई समाधान है?

धन्यवाद।

+0

दिमाग साझा करना आपने इसे कैसे ठीक किया? – Dbl

उत्तर

2

यह थोड़ी देर हो गया है लेकिन मेरे पास हाल ही में एक समान समस्या है, मेरी सूचीदृश्य की ऊंचाई में एक पंक्ति बहुत बदल गई है, जिससे listview.onmeasure कहा जाता है।

यदि आप एपीआई -14 और ऊपर के खिलाफ निर्माण कर रहे हैं, तो आप एसडीके स्रोत कोड में ब्रेकपॉइंट सेट कर सकते हैं। यह समझने में मदद करनी चाहिए कि ऊंचाई क्यों बदल दी गई है।

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