2013-01-07 27 views
5

मैंने एंड्रॉइड पर एक साधारण अनंत स्क्रॉलिंग ग्रिड व्यू लागू किया है।एंड्रॉइड अनंत स्क्रॉलिंग ग्रिड, क्या एडाप्टर को अनिश्चित काल तक बढ़ना पड़ता है?

  1. एक onScrollListener, जब भी GridView बिल्कुल नीचे तक स्क्रॉल किया है के साथ एक GridView, मैं अपने एडाप्टर में अधिक आइटम लोड करने के लिए एक AsyncTask शुरू: मैं निम्नलिखित घटकों की है।
  2. एक एडाप्टर जो AsyncTask से प्राप्त वस्तुओं को जोड़ता है, और आग को सूचित करता है DataChanged() ताकि ग्रिड व्यू स्वयं को रीफ्रेश कर सके।

यह इस मामले अनुकूलक अनिश्चित काल के लिए बढ़ रहा है ... मैं मेरा मतलब है को छोड़कर अच्छा काम इस एडाप्टर अंत करने के लिए उपयोगकर्ता स्क्रॉल, यह एक स्मृति समस्या लगती है जब भी करने के लिए जोड़कर आइटम रखने के लिए लगता है।

अंतहीन एडाप्टर को लागू करने का सही तरीका क्या है? मैं अवधारणाओं की तलाश में हूं, न कि तीसरे पक्ष के जार जो मेरे लिए यह करता है।

धन्यवाद

समाधान
चिह्नित जवाब सही सिद्धांत है। इसका मेरा कार्यान्वयन लोड किए गए डेटा को एक SQL डेटाबेस में बैक अप करता है, इसलिए कुल प्रवाह है: इंटरनेट से डेटा को थ्रेड, पार्स में डाउनलोड करें और डेटा को थ्रेड में डेटाबेस में स्टोर करें, आग अधिसूचित करें यूआई थ्रेड पर डेटाटाइंड करें।
एडाप्टर की getCount() विधि डेटाबेस से एक चुनिंदा गिनती (आईडी) करता है, और यह एडाप्टर के उपयोग के लिए डेटाबेस में स्मृति से ऑब्जेक्ट्स का एक बैच पुनर्प्राप्त करता है।

+0

हाय। किसी भी मौके से आपने इस समस्या को हल किया और कुछ कोड पोस्ट कर सकते हैं? – OWADVL

+0

हां, मैंने अपना अंतिम दृष्टिकोण मूल समाधान में * समाधान * – Chao

उत्तर

3

हां, आम तौर पर यदि आपका GridView अनंत है, तो आपका Adapter अनंत है। यदि आपके पास स्मृति में अधिक डेटा लोड करने का निष्पक्ष कार्यान्वयन है तो आप निश्चित रूप से किसी बिंदु पर स्मृति समस्या में भाग लेंगे। इसे पाने के लिए, आपको किसी बिंदु पर पुराना डेटा जारी करना होगा।

मान लें कि आपके एडाप्टर को कुछ "अनंत" स्टोर तक पहुंच है, जहां से यह इंटरनेट (कई बार इंटरनेट) से प्राप्त होता है, आप अधिकतम आकार (या तो बाइट्स या आइटम गिनती में) डेटा को स्मृति में रखने के लिए सेट कर सकते हैं आपका एडाप्टर जब आप अधिकतम आकार को पार करते हैं, तो आप पुरानी वस्तुओं को स्मृति से शुद्ध कर सकते हैं। यदि इन पुरानी वस्तुओं से दोबारा अनुरोध किया जाता है, तो आप स्मृति से बजाय अनंत स्टोर से उन्हें फिर से लोड करते हैं (और शायद अन्य पुरानी वस्तुओं को स्मृति से शुद्ध किया जाता है)।

अपने GridView आइटम एक Adapter जो कैश के कुछ प्रकार में डेटा संग्रहीत करता से बनाया जाता है (LruCache यहाँ उपयोगी हो सकता है), जो कुछ (शायद बाह्य) दुकान के द्वारा समर्थित है इसका मतलब यह है। आप मेमोरी कैश और बाहरी स्टोर के बीच डिस्क कैश भी डाल सकते हैं।

+0

के तहत रखा है, यह निश्चित रूप से घंटी बजता है, मैं इसे लागू करने और वापस रिपोर्ट करने जा रहा हूं। धन्यवाद! – Chao