डाइनैमिक सूची को पसंद के मुताबिक बनाना यह Android Jetpack का हिस्सा है.
अपनी खास ज़रूरतों को पूरा करने के लिए,
RecyclerView
ऑब्जेक्ट को पसंद के मुताबिक बनाया जा सकता है. RecyclerView की मदद से डाइनैमिक सूचियां बनाएं में बताई गई स्टैंडर्ड क्लास, वे सभी सुविधाएं उपलब्ध कराती हैं जिनकी ज़रूरत ज़्यादातर डेवलपर को होती है. कई मामलों में, आपको सिर्फ़ हर व्यू होल्डर के लिए व्यू डिज़ाइन करना होता है. साथ ही, उन व्यू को सही डेटा के साथ अपडेट करने के लिए कोड लिखना होता है. हालांकि, अगर आपके ऐप्लिकेशन की कुछ खास ज़रूरतें हैं, तो स्टैंडर्ड तरीके में कई तरह से बदलाव किया जा सकता है.
इस दस्तावेज़ में, पसंद के मुताबिक किए जा सकने वाले कुछ बदलावों के बारे में बताया गया है.
लेआउट में बदलाव करना
RecyclerView, स्क्रीन पर अलग-अलग आइटम को व्यवस्थित करने के लिए, लेआउट मैनेजर का इस्तेमाल करता है. साथ ही, यह तय करता है कि उपयोगकर्ता को अब न दिखने वाले आइटम व्यू का फिर से इस्तेमाल कब करना है. किसी व्यू को फिर से इस्तेमाल करने या रीसाइकल करने के लिए, लेआउट मैनेजर, अडैप्टर से व्यू के कॉन्टेंट को डेटासेट के किसी दूसरे एलिमेंट से बदलने के लिए कह सकता है. इस तरह से व्यू को रीसाइकल करने से, परफ़ॉर्मेंस बेहतर होती है. ऐसा इसलिए होता है, क्योंकि इससे ग़ैर-ज़रूरी व्यू बनाने या ज़्यादा रिसॉर्स खर्च करने वाले findViewById() लुकअप करने से बचा जा सकता है. Android सपोर्ट लाइब्रेरी में तीन स्टैंडर्ड लेआउट मैनेजर शामिल हैं. इनमें से हर एक में, अपनी पसंद के मुताबिक बदलाव करने के कई विकल्प मिलते हैं:
LinearLayoutManager: यह आइटम को एक-डाइमेंशन वाली सूची में व्यवस्थित करता है.LinearLayoutManagerके साथRecyclerViewका इस्तेमाल करने पर,ListViewलेआउट जैसी सुविधाएं मिलती हैं.GridLayoutManager: यह आइटम को दो डाइमेंशन वाले ग्रिड में व्यवस्थित करता है, जैसे कि चेकरबोर्ड पर मौजूद स्क्वेयर.GridLayoutManagerके साथRecyclerViewका इस्तेमाल करने पर,GridViewलेआउट जैसी सुविधाएं मिलती हैं.StaggeredGridLayoutManager: यह आइटम को दो डाइमेंशन वाले ग्रिड में व्यवस्थित करता है. इसमें हर कॉलम, पहले वाले कॉलम से थोड़ा सा ऑफ़सेट होता है. जैसे, अमेरिकी झंडे पर बने सितारे.
अगर ये लेआउट मैनेजर आपकी ज़रूरतों के मुताबिक नहीं हैं, तो RecyclerView.LayoutManager ऐब्स्ट्रैक्ट क्लास को एक्सटेंड करके, अपना लेआउट मैनेजर बनाया जा सकता है.
आइटम के लिए ऐनिमेशन जोड़ना
जब भी किसी आइटम में बदलाव होता है, तो RecyclerView उसके दिखने के तरीके को बदलने के लिए, ऐनिमेटर का इस्तेमाल करता है. यह ऐनिमेटर एक ऑब्जेक्ट है, जो ऐब्स्ट्रैक्ट RecyclerView.ItemAnimator क्लास को एक्सटेंड करता है. डिफ़ॉल्ट रूप से, RecyclerView ऐनिमेशन दिखाने के लिए DefaultItemAnimator का इस्तेमाल करता है. अगर आपको कस्टम ऐनिमेशन उपलब्ध कराने हैं, तो RecyclerView.ItemAnimator को एक्सटेंड करके, अपना ऐनिमेटर ऑब्जेक्ट तय किया जा सकता है.
सूची में मौजूद आइटम चुनने की सुविधा चालू करना
recyclerview-selection लाइब्रेरी की मदद से, उपयोगकर्ता टच या माउस इनपुट का इस्तेमाल करके, RecyclerView सूची में आइटम चुन सकते हैं. इससे आपको चुने गए आइटम के विज़ुअल प्रज़ेंटेशन पर कंट्रोल बनाए रखने में मदद मिलती है. आपके पास आइटम चुनने के तरीके को कंट्रोल करने वाली नीतियों पर भी कंट्रोल बनाए रखने का विकल्प होता है. जैसे, कौनसे आइटम चुने जा सकते हैं और कितने आइटम चुने जा सकते हैं.
RecyclerView इंस्टेंस में आइटम चुनने की सुविधा जोड़ने के लिए, यह तरीका अपनाएं:
- तय करें कि किस तरह की सिलेक्शन कुंजी का इस्तेमाल करना है. इसके बाद, एक
ItemKeyProviderबनाएं.चुने गए आइटम की पहचान करने के लिए, तीन तरह की कुंजियों का इस्तेमाल किया जा सकता है:
Parcelableऔर इसकी सब-क्लास, जैसे किUriStringLong
सिलेक्शन-की के टाइप के बारे में ज़्यादा जानकारी के लिए,
SelectionTracker.Builderदेखें. ItemDetailsLookupलागू करें.RecyclerViewमें मौजूद आइटमViewऑब्जेक्ट को अपडेट करें, ताकि यह पता चल सके कि उपयोगकर्ता ने उन्हें चुना है या नहीं.चुने गए आइटम के लिए, सिलेक्शन लाइब्रेरी डिफ़ॉल्ट विज़ुअल डेकोरेशन उपलब्ध नहीं कराती है.
onBindViewHolder()लागू करते समय यह जानकारी दें. हमारा सुझाव है कि आप यह तरीका अपनाएं:onBindViewHolder()में,Viewऑब्जेक्ट परsetActivated()—notsetSelected()—को कॉल करें. इसके लिए,trueयाfalseका इस्तेमाल करें. यह इस बात पर निर्भर करता है कि आइटम चुना गया है या नहीं.- व्यू की स्टाइलिंग को अपडेट करें, ताकि चालू होने की स्थिति दिख सके. हमारा सुझाव है कि स्टाइलिंग को कॉन्फ़िगर करने के लिए, कलर स्टेट लिस्ट रिसॉर्स का इस्तेमाल करें.
ActionModeका इस्तेमाल करके, उपयोगकर्ता को चुने गए टेक्स्ट पर कार्रवाई करने के लिए टूल उपलब्ध कराएं.- इंटरप्रेट की गई कोई भी सेकंडरी कार्रवाई करना.
SelectionTracker.Builderकी मदद से, सभी चीज़ों को एक साथ जोड़ें.- चुने गए हिस्से को गतिविधि पूरी होने की प्रोसेस के इवेंट में शामिल करें.
ItemDetailsLookup, सिलेक्शन लाइब्रेरी को MotionEvent के हिसाब से RecyclerView आइटम की जानकारी ऐक्सेस करने की अनुमति देता है.
यह असल में ItemDetails के इंस्टेंस के लिए एक फ़ैक्ट्री है, जिसका बैक अप RecyclerView.ViewHolder के इंस्टेंस से लिया जाता है या उससे निकाला जाता है.
SelectionTracker.SelectionObserver
रजिस्टर करें, ताकि चुने गए विकल्प में बदलाव होने पर आपको सूचना मिल सके. जब पहली बार कोई आइटम चुना जाता है, तो उपयोगकर्ता को यह दिखाने के लिए ActionMode शुरू करें. साथ ही, चुने गए आइटम के हिसाब से कार्रवाइयां उपलब्ध कराएं. उदाहरण के लिए, ActionMode बार में 'मिटाएं' बटन जोड़ा जा सकता है. साथ ही, चुने गए आइटम को हटाने के लिए, बार पर मौजूद 'वापस जाएं' ऐरो को कनेक्ट किया जा सकता है. जब चुने गए आइटम की सूची खाली हो जाए, तो ऐक्शन मोड को बंद कर दें. ऐसा तब होता है, जब उपयोगकर्ता आखिरी बार चुने गए आइटम को हटा देता है.
इवेंट प्रोसेसिंग पाइपलाइन के आखिर में, लाइब्रेरी यह तय कर सकती है कि उपयोगकर्ता किसी आइटम पर टैप करके उसे चालू करने की कोशिश कर रहा है या किसी आइटम या चुने गए आइटम के सेट को खींचकर छोड़ने की कोशिश कर रहा है. सही लिसनर को रजिस्टर करके, इन इंटरप्रिटेशन पर प्रतिक्रिया दें. ज़्यादा जानकारी के लिए, SelectionTracker.Builder देखें.
यहां दिए गए उदाहरण में, इन हिस्सों को एक साथ जोड़ने का तरीका बताया गया है:
Kotlin
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
SelectionTracker
इंस्टेंस बनाने के लिए, आपके ऐप्लिकेशन को वही
RecyclerView.Adapter
देना होगा जिसका इस्तेमाल आपने RecyclerView को
SelectionTracker.Builder के लिए शुरू करने के लिए किया था. इस वजह से, SelectionTracker इंस्टेंस बनाने के बाद, इसे अपने RecyclerView.Adapter में इंजेक्ट करें. अगर ऐसा नहीं है, तो onBindViewHolder() तरीके से किसी आइटम के चुने गए स्टेटस की जांच नहीं की जा सकती.
गतिविधि के लाइफ़साइकल इवेंट के दौरान, चुने गए आइटम की स्थिति को बनाए रखने के लिए, आपके ऐप्लिकेशन को गतिविधि के onSaveInstanceState() और onRestoreInstanceState() तरीकों से, सिलेक्शन ट्रैकर के onSaveInstanceState() और onRestoreInstanceState() तरीकों को कॉल करना होगा. आपके ऐप्लिकेशन को SelectionTracker.Builder कंस्ट्रक्टर को एक यूनीक सिलेक्शन आईडी भी देना होगा. इस आईडी की ज़रूरत इसलिए होती है, क्योंकि किसी गतिविधि या फ़्रैगमेंट में एक से ज़्यादा अलग-अलग सूचियां हो सकती हैं. इन सभी सूचियों को सेव की गई स्थिति में बनाए रखना ज़रूरी होता है.
अन्य संसाधन
ज़्यादा जानकारी के लिए, यहां दिए गए रेफ़रंस देखें.
- Sunflower
डेमो ऐप्लिकेशन, जो
RecyclerViewका इस्तेमाल करता है. - स्क्रोल की जा सकने वाली सूची दिखाने के लिए, RecyclerView का इस्तेमाल करना कोडलैब.
- Android Kotlin Fundamentals: RecyclerView fundamentals कोडलैब.