2016-09-06 8 views
7

मेरे पास दो RecyclerView.Adapter एस हैं जो आंतरिक कक्षाओं के समान RecyclerView.ViewHolder एस का उपयोग कर रहे हैं।क्या RecyclerView.ViewHolder हमेशा एक आंतरिक वर्ग होना है?

मैं कोड डुप्लिकेशन से छुटकारा पाने के लिए चाहता था और इन ViewHolder एस मुक्त, अलग वर्ग बना दिया ताकि ब्रांड नई कक्षा अब किसी भी RecyclerView.Adapter एस द्वारा उपयोग की जा सके।

हालांकि मुझे एडाप्टर ऑब्जेक्ट्स तक पहुंचने में कठिनाई के लिए कई परेशानी का सामना करना पड़ा। getAdapterPosition() हमेशा -1 देता है।

इसलिए मैंने अपना दिमाग बदल दिया और सुपर RecyclerView.Adapter वर्ग बनाया जो कि उन एडाप्टर द्वारा बढ़ाया गया है और व्यूहोल्डर को सुपरक्लास में रखा गया है ताकि वे एडाप्टर इसे उप-वर्ग से उपयोग कर सकें।

लेकिन मुझे यह जानना है कि ViewHolder को एक आंतरिक कक्षा होना चाहिए। यह मुझे नाराज बनाता है। कृपया मुझे सलाह नहीं करते एडाप्टर वर्गों गठबंधन करने के लिए, वे पूरी तरह से अलग कर रहे हैं के रूप में ViewHolder सिर्फ एक विशेष viewType है कि मैं अपने बेहतर दृष्टिकोण जो मुझे बेहतर महसूस करने के लिए इंतज़ार कर रहा हूँ किसी भी RecyclerView

में प्रदर्शित किया जा सकता है।

सम्मान।

+1

जावा में असली आंतरिक कक्षाएं भी नहीं हैं, केवल कुछ सिंटेक्टिक चीनी समान पैकेज पैकेजों को उसी .java फ़ाइल में लिखने के लिए है। यदि आपको व्यूहोल्डर्स के साथ गैर-आंतरिक कक्षाओं के रूप में समस्याएं हैं, तो कृपया समस्याग्रस्त कोड पोस्ट करें। – laalto

उत्तर

3

व्यूहोल्डर के बाहर हो सकता है। इनर क्लास रीसाइक्लर व्यू के लिए सभी ट्यूटोरियल में केवल एक प्रस्ताव है, यह एक बेहतर तरीका है यदि आपके व्यूहोल्डर को सभी एडाप्टर पैरामीटर तक पहुंच होनी चाहिए, यहां तक ​​कि उन निजी, लेकिन एडाप्टर और व्यूहोल्डर में एक्सेस विधियों द्वारा किसी एक्सेस या ऑब्जेक्ट रिलेशनशिप को फिर से बनाया जा सकता है।

मैंने व्यूहोल्डर के उपयोग के साथ बाहरी कक्षा के रूप में स्टैंड अकेले प्रोजेक्ट बनाया है, एक नज़र डालें। भंडार से लिंक - https://github.com/maciejsikora/outsideviewholder

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

प्रश्न के उत्तर का जवाब है - व्यूहोल्डर को आंतरिक वर्ग नहीं होना चाहिए, और आपकी समस्याएं बाहरी कक्षा के रूप में व्यूहोल्डर का उपयोग करने में अमान्य कोड कार्यान्वयन के कारण होती हैं।

+0

ऑनक्लिक लिस्टनर को लागू करने वाले मेरे विचार में एक बटन है। जब श्रोता ने आह्वान किया तो मुझे उस ऑब्जेक्ट के बटन पर क्लिक करने की आवश्यकता है, इसलिए मुझे एडाप्टर की स्थिति तक पहुंच प्राप्त करनी होगी। हालांकि, getAdapterPosition() को कॉल करना मुझे -1 देता है इसलिए मैंने इंडेक्सऑटऑफबाउंड अपवाद को क्रैश कर दिया, शायद आपको अपने प्रोजेक्ट में -1 भी मिलेगा। :) –

+0

@ EgemenHamutçu मुझे यकीन नहीं है। स्थिति तक पहुंचने के लिए एडाप्टर में गेटटर बनाएं और एडाप्टर को व्यूहोल्डर पर सेट करें। –

0

मैंने हमेशा इसे आंतरिक के रूप में उपयोग किया है। मैं आपकी समस्या को समझता हूं और मैंने थोड़ी देर के लिए इसके साथ निपटाया और मुझे लगता है कि इस पोस्ट का जवाब है। इस जवाब के लड़के को एडाप्टर के साथ भी समस्याएं थीं।

यह यहाँ देखें: https://stackoverflow.com/a/29719632/6634292

आपका प्रश्न एक दिलचस्प सवाल यह है;)

4
असल

, नहीं

सबसे पहले आपको यह समझने की आवश्यकता है कि हमें आंतरिक कक्षा की आवश्यकता क्यों है?

हम इनर कक्षाएं जहां हम चाहते हैं कि केवल विशेष वर्ग के कई Listeners और Button onClick और कई और अधिक के लिए इस functionality.Like हम कई भीतरी वर्ग है होगा की जरूरत है।

तो हम के लिए आंतरिक वर्ग का उपयोग निजी, लघु और सरल बनाने के लिए करते हैं।

आप यह चीज़ (ViewHolder) एक अलग वर्ग बना सकते हैं। लेकिन यह कुशल नहीं होगा, स्पष्ट (यदि आप एक और कक्षा बनाते हैं तो यह आपके प्रोजेक्ट में एक अतिरिक्त कक्षा जोड़ देगा), और प्रभावी तरीका।

+0

आंतरिक कक्षाएं भी "अतिरिक्त कक्षाएं" हैं। – laalto

+0

हां। लेकिन वे हमें स्वच्छ कोड लिखने में मदद करते हैं। –

+0

आंतरिक कक्षाएं वास्तव में बहुत बुरी आदत हैं क्योंकि वे आपकी परियोजना में "छिपा" हैं। यह बहुत "क्लीनर" है और "प्रति वर्ग एक फ़ाइल" सिद्धांत का उपयोग करने की अनुशंसा की जाती है। – breakline

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