2011-10-11 20 views
14

मैं एक छवि एडाप्टर के साथ एक गैलरी का उपयोग कर रहा हूं ताकि इसे छवि दृश्यों से लोड किया जा सके जो मेरे संसाधनों से छवियों को खींचती है। मेरी समस्या यह है कि कनवर्ट व्यू जो मेरे एडाप्टर में getView() विधि को पास हो जाता है वह हमेशा शून्य होता है। इसका मतलब यह है कि हर बार getView() कहा जाता है कि एक नया ImageView बनाया जाता है। इससे भयानक preformance की ओर जाता है क्योंकि जीसी लगातार बनाए गए सभी को मिटा देने के लिए चल रहा है और अब ImageView का उपयोग नहीं किया जाता है।गैलरी छवि एडाप्टर कन्वर्टव्यू हमेशा शून्य है

यह स्पष्ट रूप से ज्ञात बग है: Gallery's view cache is broken; never converts views.

मेरे दो पसंदीदा समाधान या तो 1. एडाप्टर में दृश्यों के कैश को स्वयं संभालते हैं और उन्हें ठीक से उपयोग करने के लिए आवश्यक सभी तर्कों का ख्याल रखते हैं। या 2. गैलरी विजेट की अपनी प्रतिलिपि शामिल करें और इसे ठीक करने का प्रयास करें ताकि यह ठीक से पुनर्नवीनीकरण दृश्य लौटा सके।

मैंने विकल्प को कार्यान्वित करना शुरू कर दिया है लेकिन मुझे जल्दी से पता चल रहा है कि मुझे बिल्कुल पता नहीं है कि उस ऑपरेशन के पीछे सभी तर्क कैसे बनाएं। मुझे लगता है कि विकल्प दो आसान हो सकता है।

मैं गैलरी विजेट यहाँ कोड मिल गया है: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/Gallery.java

मैं पूरी तरह से यह समझ में नहीं आता है, लेकिन मैं देख सकता हूँ कि यह लाइन 745 मेरे पर

child = mAdapter.getView(position, null, this); 

बुला रहा है (अंधेरे में गोली मार दी) अनुमान लगाओ कि यह समस्या की जड़ है।

क्या किसी को इस बग के साथ अनुभव है। या क्या कोई मुझे सही दिशा में इंगित कर सकता है कि रीसाइक्लर की स्थिति कैसे काम करती है ताकि मैं इस विजेट को सही ढंग से काम करने के लिए ट्विक कर सकूं? या यहां तक ​​कि कुछ वैकल्पिक विकल्प भी सुझाएं जिन्हें मैं अनदेखा कर सकता हूं।

संपादित करें: सबसे अच्छा समाधान जो मैंने कभी पाया वह इको गैलरी नामक एक कार्यान्वयन था। एकमात्र जगह मैं इसे संदर्भित कर सकता हूं online anymore is here। इसे काम करने के लिए आपको अपनी परियोजना के भीतर सही जगह पर प्रत्येक खंड को रखना होगा।

+0

मई यह मदद करता है http://stackoverflow.com/questions/10769989/how-do-i-get-the-selected-item-from-a-gridview-with-imageadapter-android –

उत्तर

3

विशेष रूप से उस बग के साथ कोई अनुभव नहीं है, लेकिन मैंने तृतीय पक्ष दृश्य पेजर (समर्थन lib से पहले) के साथ कस्टम कैशिंग किया है।

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

[V1, V2, V3] 

अब केवल एक चीज जो आपको करने की ज़रूरत है वह आपके कैश में स्थिति में आपके एडाप्टर की स्थिति से संबंधित है। इस तरह से निपटने के कई तरीके हैं। जब मैंने पहली बार इसे बाहर बढ़ाया, तो मैंने जो भी मेरा वर्तमान दृश्य वी 2 होना था और पेजर को फ़्लिप करते समय चारों ओर सरणी के आइटम घुमाए। तो अगली देखने के लिए flipping मेरी सरणी

[V2, V3, V1] 

के साथ बनाए रखने के लिए सरल था बदल जाती। या आप केवल गणित कर सकते हैं और कैश की सापेक्ष स्थिति की स्थिति की गणना कर सकते हैं।

एक और दृष्टिकोण आखिरी में, पहले कतार बनाने के लिए है। उन्हें कतार में धक्का देकर रीसायकल दृश्य, और जब आपको किसी दृश्य की आवश्यकता होती है, तो बस इसे से पॉप करें।

+0

मैंने थोड़ी देर के लिए प्रयास किया मेरे लिए विचार रखने के लिए कतार वस्तु। इसे कभी काम नहीं मिला, लेकिन मैं सहमत हूं कि इसे इस तरह से किया जा सकता है =) – FoamyGuy

+0

अपने दृश्य को कैश करने के लिए एक दृश्य सरणी का उपयोग करें, और 'cachePos = position% VIEW_CACHE_SIZE' – shaobin0604

1

मुझे गैलरी विजेट के साथ अनुभव नहीं है, लेकिन मैं छवियों के साथ बहुत सारे सूची दृश्य का उपयोग कर रहा हूं।आपकी समस्या के अनुसार, और Google समस्या से लिंक, उन्होंने अभी भी इस समस्या को ठीक नहीं किया है।

तो, अच्छी लाइब्रेरी (और इसके भीतर उदाहरण) के साथ समाधान है, जो कैश/AJAX समस्याओं को हल करता है, और भी बहुत कुछ।

लिंक library

या, और अधिक ठोस करने के लिए, छवि के लिए लिंक examples

आप अपने उदाहरण डाउनलोड करते हैं, तो आप पाएंगे कि वे किस तरह

में गैलरी विजेट के साथ गैलरी लागू किया, उनके AQuery उपयोगिता वर्ग का उपयोग कर

com.androidquery.test.image.ImageLoadingGalleryActivity कक्षा।

final List<Photo> entries;// here only to show what enteries are... 

    listAq = new AQuery(this); //define as Action class member, here only to show what it is 

    ArrayAdapter<Photo> aa = new ArrayAdapter<Photo>(this, R.layout.gallery_item, entries){ 

     public View getView(int position, View convertView, ViewGroup parent) { 

      if(convertView == null){ 
       convertView = getLayoutInflater().inflate(R.layout.gallery_item, parent, false); 
      } 

      Photo photo = getItem(position); 

      AQuery aq = listAq.recycle(convertView); 

      aq.id(R.id.name).text(photo.title); 

      String tbUrl = photo.tb; 

      if(!aq.shouldDelay(position, convertView, parent, tbUrl)){ 
       aq.id(R.id.tb).image(tbUrl); 
       aq.id(R.id.text).text(photo.title).gone(); 
      }else{ 
       aq.id(R.id.tb).clear(); 
       aq.id(R.id.text).text(photo.title).visible(); 
      } 


      return convertView; 

     } 


    }; 

    aq.id(R.id.gallery).adapter(aa); 

कहाँ फोटो सिर्फ POJO वस्तु (रिमोट से लाई गई) है:

कोड से

स्निपेट

class Photo { 
    String tb; 
    String url; 
    String title; 
    String author; 
} 

R.id.gallery

<Gallery 
     android:id="@+id/gallery" 
     android:layout_width="fill_parent" 
     android:layout_height="200dip" /> 

को संदर्भित करता है और R.layout.gallery_item को दर्शाता है:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="100dip" 
     android:layout_height="75dip" > 

     <ProgressBar 
      android:id="@+id/progress" 
      android:layout_width="15dip" 
      android:layout_height="15dip" 
      android:layout_centerInParent="true" /> 

     <ImageView 
      android:id="@+id/tb" 
      style="@style/GalleryItem" 
      android:layout_width="100dip" 
      android:layout_height="75dip" /> 

     <TextView 
      android:id="@+id/text" 
      android:layout_width="100dip" 
      android:layout_height="75dip" 
      android:gravity="center" 
      android:maxLines="4" 
      android:padding="15dip" 
      android:text="Dummy TextDummy TextDummy TextDummy TextDummy Text" 
      android:textColor="#FFFFFFFF" 
      android:textSize="8sp" /> 

    </RelativeLayout> 

आशा है कि आपको यह समस्या आपकी समस्या को हल करने में उपयोगी लगेगी।

0

मुझे कस्टम कैश का उपयोग करके इसके आसपास मिल गया है क्योंकि डस्कनर सुझाव देता है।

मैं पूर्व-गणना (आइटम की स्क्रीनविड्थ/मिनीविड्थ) आइटम की अधिकतम # स्क्रीन पर गैलरी में दिखाया जा सकता है और कुछ और जोड़ सकता हूं (गैलरी को बाईं ओर आइटम दिखाने के लिए अतिरिक्त की आवश्यकता होगी और ठीक है जैसे आप इसे स्क्रॉल करते हैं)। मैं इस आकार की एक सरणी बनाता हूं - विचारों को अनुरोध के रूप में बनाया गया है और कैश में रखा गया है। GetView कहलाते समय कैश किए गए दृश्य को वापस करने के लिए स्थिति कैशिंग का उपयोग करें।

+0

थोड़ा कोड नमूना, या कुछ कोड/गीस्ट का लिंक होगा यहां बहुत मदद करें। – iwein

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