क्या हमें सूची दृश्य को बदलने के लिए RecyclerView का उपयोग करना चाहिए?


232

Android डॉक्स कहते हैं:

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

वास्तव ListViewमें उपरोक्त सभी कर सकते हैं यदि दक्षता कोई मायने नहीं रखती है, और जब हम RecyclerViewप्रतिस्थापित करने के लिए उपयोग करते हैं तो हमें कई मुद्दे मिले हैं ListView:

  1. सूची आइटम चयन - समाधान के लिए कोई onItemClickListener () नहीं है

  2. सूची मदों के बीच कोई विभक्त - समाधान

  3. कोई अंतर्निहित ओवरलैप चयनकर्ता नहीं, सूची आइटम - समाधान पर क्लिक करने पर कोई दृश्य प्रतिक्रिया नहीं होती है

  4. सूची शीर्षलेख - समाधान के लिए कोई addHeaderView नहीं

शायद और मुद्दे ...

इसलिए जब हम RecyclerViewप्रतिस्थापित करने के लिए उपयोग करते हैं ListView, तो हमें उसी प्रभाव तक पहुंचने के लिए बहुत अतिरिक्त कोडिंग करनी होगी ListView

सवाल:

  • इसके लायक है कि हम की जगह है ListViewके साथ RecyclerViewपूरी तरह से?
  • यदि नहीं, तो किस मामले में हमें RecyclerViewइसके बजाय बेहतर उपयोग करना चाहिए ListView, और इसके विपरीत?

9
आपका धागा सिर्फ पहला मुद्दा है, और मेरा सवाल नहीं है
Xcihnegn

3
बस उल्लेख है कि आप एक recyclerview का उपयोग करना चाहिए अगर आप एक ढह कार्रवाई पट्टी का उपयोग करने में रुचि रखते हैं। medium.com/android-bites/…
francas

आपको recyclerview का उपयोग करना चाहिए क्योंकि यह listview से अधिक नियंत्रण प्रदान करता है। यह लिट्ल बिट कॉम्प्लेक्स है लेकिन आप वहां पहुंच जाते हैं तब आपका जीवन सुपर आसान हो जाएगा जब भी आप सूची प्रकार के साथ काम कर रहे हैं।
सदाशिव

3
बेहतर अच्छे का दुश्मन है।
पुराना

जवाबों:


118

यदि ListView आपके लिए काम करता है, तो माइग्रेट करने का कोई कारण नहीं है। यदि आप एक नया UI लिख रहे हैं, तो आप RecyclerView के साथ बेहतर हो सकते हैं।

जब आप अपनी सूची को अनुकूलित करना चाहते हैं या आप बेहतर एनिमेशन चाहते हैं तो RecyclerView शक्तिशाली है। ListView में उन सुविधा विधियों से लोगों को बहुत परेशानी हुई, यही वजह है कि RecyclerView उनके लिए अधिक लचीला समाधान प्रदान करता है।

माइग्रेशन के लिए आपको जो बड़ा बदलाव करना है, वह आपके एडॉप्टर में है। यदि आप कॉल करते रहना चाहते हैं notifyDataSetChanged, तो आप अधिकांश एनीमेशन और बाध्यकारी लाभ खो देते हैं। लेकिन यदि आप अपने एडाप्टर को विस्तृत अधिसूचित घटनाओं (जोड़ा / हटाया / स्थानांतरित / अद्यतित) को भेजने के लिए बदल सकते हैं, तो आपको बहुत बेहतर एनिमेशन और प्रदर्शन मिलते हैं। इन घटनाओं ने RecyclerView को सही एनिमेशन चुनने दिया और यह अनावश्यक onBindकॉल से बचने में भी मदद करता है । यदि आपके आइटम दृश्य जटिल हैं, तो आपको एक बड़ा लाभ मिलेगा। इसके अलावा, आगे जा रहे हैं, RecyclerView के आसपास अधिक घटक होंगे।


2
अगर मैं तुम्हें 100 upvotes दे सकता था। इस notifyDataSetChanged()पद्धति के कारण मुझे हर समय RecyclerViewनए के लिए पूछते रहते ViewHoldersथे, ViewHolderपैटर्न के लाभों को बताते हुए । समाधान की तलाश में मुझे आपकी टिप्पणी मिली जो मेरी समस्या का उत्तर देने में बहुत अधिक है: डी धन्यवाद!
आकांक्षा देव

मैं सहमत नहीं हूँ "यदि आपके आइटम दृश्य जटिल हैं, तो आपको बहुत बड़ा लाभ मिलेगा", मेरे पास रिसाइक्लरव्यू है जिसमें एडेप्टर में 3 यदि और है, तो Recyclerview मेरे मामले में खराब प्रदर्शन करता है। मुझे पुनर्चक्रण का उपयोग करके अक्षम करना पड़ा isRecyclable(false);और अंतिम परिणाम अत्यधिक सुस्त RecyclerView है। मैं इसे बदल भी नहीं सकता, सूची में वापस जाने में बहुत समय लगेगा :(
kashyap jimuliya

4
लोग आरवी डब्ल्यू / कई और प्रकारों का उपयोग करते हैं फिर डब्ल्यू / ओ किसी भी समस्या और अच्छे प्रदर्शन के लिए। आपके कोड में कुछ और गलत है। आपको सिस्ट्रेस / ट्रेसव्यू का उपयोग करना चाहिए और देखना होगा कि क्या चल रहा है।

1
@ यशपीजिमुलिया जैसा कि यित्ग ने उल्लेख किया है, 3 अगर-और का कारण नहीं होना चाहिए। सबसे पहले, आपने यह उल्लेख नहीं किया कि आपने इन्हें कहाँ रखा है; दूसरी बात, रीसाइक्लिंग को अक्षम करने से इसे धीमा होना चाहिए। क्यों? क्योंकि किसी भी तरह से देखने और करने findViewById()का ViewHolderतरीका बहुत महंगा है ।
सूफियान

24

मेरे अनुसार, यदि ListView आपके ऐप की सभी मौजूदा ज़रूरतों को पूरा करता है और सभी उपयोग-मामलों को संतुष्ट करता है, तो इसे RecyclerView के साथ बदलने की कोई आवश्यकता नहीं है।

डेवलपर्स के लिए जटिलता को बढ़ाने की कीमत पर RecyclerView अपने डेवलपर्स को बहुत बड़ी शक्ति देता है। कुछ चीजें हैं जो आसानी से एक सूची में की जा सकती हैं, अब बहुत सारे अनावश्यक प्रयास कर सकते हैं।

लेकिन हां, कई चीजें हैं जो एक ListView कभी नहीं कर सकती हैं, जैसे कि अद्भुत LayoutManager सुविधा जो आपको गतिशील रूप से लेआउट को क्षैतिज, ऊर्ध्वाधर, ग्रिड या कंपित ग्रिड में मूल रूप से बदलने की अनुमति दे सकती है।

मैंने इस विषय पर यहाँ एक विस्तृत उत्तर लिखा है


3
ज़रूर, RecyclerView जटिलता बढ़ाता है, लेकिन कम से कम यह आपके लिए ViewHolder पैटर्न को ठीक से लागू करता है।
इगोरगानापोलस्की

ViewHolder पैटर्न कार्यान्वयन के लिए @IgorGanapolsky +1।
श्रीकांत करुमनघाट

आप अपने खुद के व्यू होल्डर पैटर्न को लिस्ट व्यू के साथ ठीक लिख सकते हैं
dan

9

1 आप एक श्रोता को एक क्लिक श्रोता प्रदान करने के लिए इंटरफ़ेस का उपयोग कर सकते हैं। मैं ListViews के साथ भी इस तकनीक का उपयोग करता हूं।
2 कोई डिवाइडर: बस अपनी पंक्ति में मैच_परेंट की चौड़ाई और 1dp की ऊंचाई के साथ एक दृश्य जोड़ें और इसे पृष्ठभूमि रंग दें
3 बस पंक्ति पृष्ठभूमि के लिए एक स्टेटलिस्ट चयनकर्ता का उपयोग करें।
4 AddHeaderView को ListViews में भी टाला जा सकता है: बस हेडर को व्यू के बाहर रखें

इसलिए, यदि दक्षता आपकी चिंता है, तो हाँ , यह एक अच्छा विचार है कि एक पुनर्नवीकरण दृश्य के साथ एक सूची दृश्य को प्रतिस्थापित करें।


19
ये मेरे सवाल नहीं हैं, मेरे पास प्रत्येक मुद्दे के समाधान के लिए लिंक है
Xcihnegn

6

मेरे पास अभी तक बहुत सरल सूचियों के लिए अभी भी ListView का उपयोग कर रहा था। उदाहरण के लिए यदि मैं पाठ विकल्पों की एक सरल सूची प्रदर्शित करना चाहता हूं ...

मैंने 'मानव कारकों' पर उस निर्णय को आधार बनाया, कि प्रदर्शन कम होने पर कम कोड के साथ एक सरल सूची दृश्य बनाना बेहतर होता है। मैं अक्सर कॉलेज में एक प्रोफेसर के बारे में सोचता हूं जो कहने का शौक था: "मेरे शिक्षक महान निकल्स विर्थ, पास्कल के आविष्कारक थे, कहते थे कि अगर किसी प्रोग्राम में कोड की 50 से अधिक लाइनें हैं, तो यह गलत है ..."

लेकिन जो मुझे सूची दृश्य का उपयोग बंद करने के लिए आश्वस्त करता है, वह यह है कि इसे हाल ही में RelativeLayout के साथ एंड्रॉइड स्टूडियो डिजाइन टूल में "विरासत" श्रेणी में स्थानांतरित किया गया है।

https://developer.android.com/reference/android/widget/ListView

मुझे लगता है कि यह 'पदावनति' का 'नरम' रूप है। यह वास्तव में पदावनत होने पर बहुत विघटनकारी होगा और सभी कर्तव्यनिष्ठ डेवलपर्स ने अपने कोड को RecyclerView में स्थानांतरित कर दिया।

इसके अलावा, ListView का परिचय शीर्ष पर सही चेतावनी देता है कि RecyclerView एक बेहतर विकल्प है: "अधिक आधुनिक, लचीली और प्रदर्शन करने वाली सूचियों के लिए बेहतर दृष्टिकोण के लिए, RecyclerView का उपयोग करें।"
https://developer.android.com/reference/android/widget/ListView

इसके अलावा, ListView के लिए गाइड अभी भी कर्सर लोडरों के बारे में बात कर रहा है, लेकिन उसके बाद getSupportCursorLoader () खुद ही एपीआई 28 में पदावनत कर दिया गया है।
https://developer.android.com/guide/topics/ui-layout/listview

Android स्टूडियो में हाल ही में वृद्धि:

फ़ाइल -> नया -> टुकड़ा -> टुकड़ा (सूची)

यह हमें मूल पाठ के साथ पूरी तरह से काम कर रहे RecylerView देता है। यह ListView का उपयोग करने के लिए मेरे अंतिम वास्तविक कारण से छुटकारा दिलाता है क्योंकि यह अब एक मूल RecylerView सेट करना जितना आसान है।

सारांश में, मैं नए विकास के लिए बिल्कुल भी ListView का उपयोग करने का इरादा नहीं करता क्योंकि लेबलिंग की 'विरासत' इसे अपवित्र करने से एक कदम दूर है।


3

एकमात्र मामला जब लिस्ट व्यू का उपयोग करना अभी भी ठीक है, जब सूची गतिशील नहीं है या नेटवर्क घटनाओं से प्रभावित है। उदाहरण के लिए: नेविगेशन।

किसी अन्य उपयोग के लिए, RecyclerView लिस्ट व्यू को ग्रहण करता है। चूंकि RecyclerView केवल रीसाइक्लिंग के बारे में परवाह करता है इसलिए दृश्य संबंधित चीजों को करना आसान होगा जो सूची दृश्य में कसकर जोड़े गए थे, जैसे स्थिति / पुनर्व्यवस्था, एनीमेशन (वास्तव में यह RecyclerView.ItemAnimator के साथ आता है), कस्टम लेआउट (स्टॉक में स्टैगर्डग्रेड के अलावा है पुरानी सूची या ग्रिड शैली लेकिन यह लाइब्रेरी भी है जो इसे और भी विस्तार देती है)।

इसके अलावा अगर आप कार्ड व्यू का उपयोग करना चाहते हैं, तो मेरा मानना ​​है कि यह एकमात्र तरीका है ( कार्ड या सूची का उपयोग करते समय कुछ अच्छा पढ़ना )।


क्या आप सर्वर से डेटा की एक सूची को हथियाने का जिक्र कर रहे हैं, तो एक सूची प्रदर्शन में इस्तेमाल होने के लिए फोन पर sqlite में संग्रहीत किया जाता है (अपने अनुयायियों का कहना है) यह एक दृश्य धारक के साथ सूची से एक पुनर्नवीनीकरण दृश्य का उपयोग करने के लिए बेहतर है ?
सिंह 8989

हाँ। लेकिन सटीक होने के लिए मुझे नेविगेशन के अलावा अब ListView के लिए कोई भूमिका नहीं दिखती है और ऐसा इसलिए है क्योंकि मुझे लगता है कि वहां RecyclerView का उपयोग करना अधिक कठिन है।
इनमिथ

2

एक बढ़िया विकल्प बेस एडेप्टर का उपयोग कर रहा है। यह उपयोग का समर्थन करता है व्यूहोल्डर पैटर्न और खान में बिटमैप और बटन के साथ 100+ पंक्तियाँ हैं और यह बहुत चिकनी चलती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.