2012-07-25 11 views
14

से सभी आइटम प्राप्त करना मेरे पास ListFragmentArrayAdapter द्वारा समर्थित है जो Loader द्वारा पॉप्युलेट हो जाता है। जब उपयोगकर्ता किसी एक आइटम पर क्लिक करता है, तो मैं चयनित आइटम के संदर्भ के साथ-साथ शेष सूची आइटम को किसी अन्य खंड में पास करना चाहता हूं। मेरा सवाल यह है कि मुझे एडाप्टर से सभी आइटम कैसे प्राप्त करना चाहिए? यहाँ की संभावना है, मैं देख रहा हूँ कर रहे हैं:ArrayAdapter

1. समर्थन List

के लिए एक संदर्भ रखें ताकि तरह एडाप्टर बनाएँ:

List<DomainObject> items = new ArrayList<DomainObject>(); 
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine, items); 

और फिर बस items या इसकी एक प्रति पारित अगली गतिविधि के लिए।

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

2. एडाप्टर

जब एक आइटम क्लिक किया जाता है के माध्यम से दोहराएं, अनुकूलक के माध्यम से पुनरावृति और सूची का निर्माण। यह एक अनावश्यक काम की तरह लगता है। आइटम एडाप्टर में List में निहित हैं और मैं मैन्युअल रूप से प्रत्येक आइटम को एक नई सूची में कॉपी कर रहा हूं।

3. जब एडाप्टर के लिए एक आइटम जोड़ने से पहले एडाप्टर

को जोड़ने मदों की एक अलग सूची रखें, एक अलग सूची है कि मैं टुकड़ा में बनाए रखने के लिए जोड़ें। यह भी अपमानजनक है क्योंकि वस्तुओं की सूची ArrayAdapter और खंड में कॉपी की गई है।

उत्तर

7

समाधान है कि मैं इस बीच में साथ चले गए है। ऐसे मामलों में जहां आप इस एपीआई के खिलाफ लड़ रहे हैं, ऐसा लगता है कि कम से कम विशेष रुप से प्रदर्शित (और जटिल) BaseAdapter का उपयोग करना बेहतर है। इस आलेख में ArrayAdapter के बजाय BaseAdapter के साथ जाने के निर्णय के बारे में आप और अधिक पढ़ सकते हैं: Android Adapter Good Practices

+0

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

+0

@ scompt.com मुझे लगता है कि आपके द्वारा पोस्ट किया गया लिंक ArrayAdapter को समझा रहा है। ऐसा लगता है कि केवल ArrayAdapter समझाया गया है। मैं थोड़ा उलझन में हूं ... – theMfromA

+0

आपके द्वारा लिंक किए गए पृष्ठ से ... "केवल टेक्स्ट प्रदर्शित कर सकता है।" => गलत। "आपको CharSequence आइटम्स की एक सूची प्रदान करने के लिए मजबूर करता है ..." => गलत "यह आवश्यक है कि आप एक लेआउट संसाधन प्रदान करें जिसमें केवल एक टेक्स्ट व्यू" => गलत है। लगभग सभी मान्यताओं गलत हैं ... मेरा मतलब यह नहीं है कि ArrayAdapter बेसएडाप्टर से बेहतर है लेकिन मूल बातें गलत हैं। – Loenix

-2

मुझे लगता है कि पहली विधि यह करने का सबसे अच्छा तरीका है।

मुझे नहीं लगता कि डेटा एक और गतिविधि के लिए मूल होगा। क्योंकि, आप बंडल के माध्यम से आइटम पास करेंगे, इसलिए ऑब्जेक्ट पहले बंडल पर लिखा गया है और फिर अगली गतिविधि में हम बंडल से पढ़ते हैं।

हालांकि, यदि आप सूची को पास करने के किसी अन्य तरीके का उपयोग कर रहे हैं, तो मूल ऑब्जेक्ट पास करने के बजाय, नया ऑब्जेक्ट बनाने के लिए list.clone() का उपयोग करें।

27

मैं खेल के लिए थोड़ा देर हो चुकी हूं, लेकिन मैंने इसी तरह के मुद्दे के खिलाफ भाग लिया है।

# 1 से निपटने का एक तरीका ArrayAdapter के उप-वर्ग के भीतर सूची का संदर्भ बनाए रखना होगा, ताकि आपका पुन: उपयोग एडाप्टर ऑब्जेक्ट द्वारा नियंत्रित किया जा सके।

कुछ की तरह: सिर्फ ArrayAdapter का उपयोग नहीं करने के लिए

public class DomainAdapter extends ArrayAdapter<DomainObject> { 

    private final List<DomainObject> items; 

    public DomainAdapter(Context context, List<DomainObject> items) { 
     super(context, R.layout.mine, items); 
     this.items = items; 
    } 

    public List<DomainObject> getItems() { 
     return items; 
    } 
} 
+9

नोट। यदि आप किसी बिंदु पर एडाप्टर को फ़िल्टर करने की योजना बनाते हैं, तो इस विधि में विफल होने की संभावना है। एक फ़िल्टर करना, ArrayAdapter के लिए आंतरिक, सूची का एक नया नया उदाहरण बना देगा। जिसका अर्थ है कि आपकी बाहरी परिभाषित 'आइटम' अब एक ही सूची नहीं होगी। इसका अर्थ यह है कि अगर संशोधन बाद में किया जाता है तो यह सिंक से बाहर हो जाएगा। आप इसके बारे में यहां और अधिक पढ़ सकते हैं: http://www.jaysoyer.com/2014/07/constructor-woes-androids-arrayadapter/ –

0

एक त्वरित परीक्षण कहता है कि विधि 1 काम करता है।यह सबसे तेज़ और साफ दिखता है, लेकिन चूंकि यह अनियंत्रित है, इसलिए आप इसे इच्छित प्लेटफार्मों में परीक्षण करना चाहेंगे और जब भी वे ArrayAdapter की अंतर्निहित संरचना में परिवर्तन करते हैं तो वे अपडेट होते हैं।

मैं SDK संस्करण 22 और न्यूनतम SDK संस्करण संकलन उपयोग कर रहा हूँ 10

0

सबसे अच्छा तरीका "सूची के लिए एक संदर्भ रखना" करने के लिए है, लेकिन "आइटम" चर/निर्माता करने के लिए पैरामीटर गुजर नहीं:

List<DomainObject> items = new ArrayList<DomainObject>(); listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine);

इस तरह आप केवल एक खाली सरणी के रूप में ArrayList को तुरंत चालू करते हैं और आपको अपनी सूची को अपने आप प्रबंधित करना होगा।

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