RecyclerView की मदद से डाइनैमिक सूचियां बनाना, Android Jetpack का हिस्सा है.
RecyclerView की मदद से, डेटा के बड़े सेट को आसानी से और असरदार तरीके से दिखाया जा सकता है. आपको डेटा देना होता है और यह तय करना होता है कि हर आइटम कैसा दिखेगा. इसके बाद, RecyclerView लाइब्रेरी, ज़रूरत पड़ने पर एलिमेंट को डाइनैमिक तरीके से बनाती है.
जैसा कि नाम से पता चलता है, RecyclerView उन अलग-अलग एलिमेंट को रिसाइकल करता है. जब कोई आइटम स्क्रीन से बाहर स्क्रोल हो जाता है, तो RecyclerView उसका व्यू नहीं मिटाता. इसके बजाय, RecyclerView उस व्यू का इस्तेमाल, स्क्रीन पर स्क्रोल किए गए नए आइटम के लिए करता है. RecyclerView से परफ़ॉर्मेंस और आपके ऐप्लिकेशन की रिस्पॉन्सिवनेस बेहतर होती है. साथ ही, इससे बैटरी की खपत भी कम होती है.
मुख्य क्लास
आपकी डाइनैमिक सूची बनाने के लिए, कई क्लास एक साथ काम करती हैं.
RecyclerViewवहViewGroupहै जिसमें आपके डेटा के मुताबिक व्यू शामिल होते हैं. यह एक व्यू है. इसलिए,RecyclerViewको अपने लेआउट में उसी तरह जोड़ें जिस तरह कोई अन्य यूज़र इंटरफ़ेस (यूआई) एलिमेंट जोड़ा जाता है.सूची में मौजूद हर एलिमेंट को व्यू होल्डर ऑब्जेक्ट से तय किया जाता है. व्यू होल्डर बनाए जाने पर, उससे कोई डेटा जुड़ा नहीं होता. व्यू होल्डर बनाए जाने के बाद,
RecyclerViewउसे अपने डेटा से बाइंड करता है. `RecyclerView.ViewHolder` को बढ़ाकर, व्यू होल्डर तय किया जाता हैRecyclerView.ViewHolder.अडैप्टर में मौजूद तरीकों को कॉल करके,
RecyclerViewव्यू का अनुरोध करता है और व्यू को उनके डेटा से बाइंड करता है. अडैप्टर को बढ़ाकर, अडैप्टर तय किया जाता हैRecyclerView.Adapter.लेआउट मैनेजर, आपकी सूची में मौजूद अलग-अलग एलिमेंट को व्यवस्थित करता है. RecyclerView लाइब्रेरी से मिले लेआउट मैनेजर में से किसी एक का इस्तेमाल किया जा सकता है. इसके अलावा, अपना लेआउट मैनेजर भी तय किया जा सकता है. सभी लेआउट मैनेजर, लाइब्रेरी की
LayoutManagerऐब्स्ट्रैक्ट क्लास पर आधारित होते हैं.
RecyclerView के सैंपल ऐप्लिकेशन (Kotlin) या RecyclerView सैंपल ऐप्लिकेशन (Java) में जाकर, यह देखा जा सकता है कि ये सभी हिस्से एक साथ कैसे काम करते हैं.
RecyclerView को लागू करने का तरीका
अगर RecyclerView का इस्तेमाल करना है, तो आपको कुछ काम करने होंगे. इनके बारे में यहां विस्तार से बताया गया है.
तय करें कि सूची या ग्रिड कैसा दिखेगा. आम तौर पर, RecyclerView लाइब्रेरी के स्टैंडर्ड लेआउट मैनेजर में से किसी एक का इस्तेमाल किया जा सकता है.
तय करें कि सूची में मौजूद हर एलिमेंट कैसा दिखेगा और कैसे काम करेगा. इस डिज़ाइन के आधार पर,
ViewHolderक्लास को बढ़ाएं.ViewHolderका आपका वर्शन, सूची के आइटम के लिए सभी फ़ंक्शन उपलब्ध कराता है. आपका व्यू होल्डर, एक रैपर होता हैViewके चारों ओर. इस व्यू कोRecyclerViewमैनेज करता है.Adapterतय करें, जो आपके डेटा कोViewHolderव्यू से जोड़ता है.
कस्टमाइज़ेशन के लिए, बेहतर विकल्प भी उपलब्ध हैं. इनकी मदद से, RecyclerView को अपनी ज़रूरत के हिसाब से बनाया जा सकता है.
अपने लेआउट की योजना बनाना
RecyclerView में मौजूद आइटम,
LayoutManager
क्लास के ज़रिए व्यवस्थित किए जाते हैं. RecyclerView लाइब्रेरी, तीन लेआउट मैनेजर उपलब्ध कराती है. ये मैनेजर, लेआउट से जुड़ी आम समस्याओं को हल करते हैं:
LinearLayoutManager, आइटम को एक डाइमेंशन वाली सूची में व्यवस्थित करता है.GridLayoutManager, आइटम को दो डाइमेंशन वाले ग्रिड में व्यवस्थित करता है:- अगर ग्रिड को वर्टिकल तौर पर व्यवस्थित किया जाता है, तो
GridLayoutManagerहर पंक्ति में मौजूद सभी एलिमेंट की चौड़ाई और ऊंचाई एक जैसी रखने की कोशिश करता है. हालांकि, अलग-अलग पंक्तियों की ऊंचाई अलग-अलग हो सकती है. - अगर ग्रिड को हॉरिज़ॉन्टल तौर पर व्यवस्थित किया जाता है, तो
GridLayoutManagerहर कॉलम में मौजूद सभी एलिमेंट की चौड़ाई और ऊंचाई एक जैसी रखने की कोशिश करता है. हालांकि, अलग-अलग कॉलम की चौड़ाई अलग-अलग हो सकती है.
- अगर ग्रिड को वर्टिकल तौर पर व्यवस्थित किया जाता है, तो
StaggeredGridLayoutManagerGridLayoutManagerकी तरह ही होता है. हालांकि, इसके लिए ज़रूरी नहीं है कि वर्टिकल ग्रिड में एक पंक्ति में मौजूद आइटम की ऊंचाई एक जैसी हो या हॉरिज़ॉन्टल ग्रिड में एक कॉलम में मौजूद आइटम की चौड़ाई एक जैसी हो. इसका नतीजा यह होता है कि किसी पंक्ति या कॉलम में मौजूद आइटम, एक-दूसरे से ऑफ़सेट हो सकते हैं.
आपको अलग-अलग आइटम का लेआउट भी डिज़ाइन करना होगा. अगले सेक्शन में बताए गए तरीके के मुताबिक, व्यू होल्डर डिज़ाइन करते समय आपको इस लेआउट की ज़रूरत होगी.
अपना अडैप्टर और व्यू होल्डर लागू करना
लेआउट तय करने के बाद, आपको अपना Adapter और ViewHolder लागू करना होगा. ये दोनों क्लास, यह तय करने के लिए एक साथ काम करती हैं कि आपका डेटा कैसे दिखेगा. ViewHolder एक View के चारों ओर एक रैपर होता है. इसमें सूची के किसी आइटम का
लेआउट शामिल होता है. Adapter, ज़रूरत के हिसाब से ViewHolder ऑब्जेक्ट बनाता है. साथ ही, उन व्यू के लिए डेटा भी सेट करता है. व्यू को उनके डेटा से जोड़ने की प्रोसेस को बाइंडिंग कहा जाता है.
अडैप्टर तय करते समय, आपको तीन मुख्य तरीकों को ओवरराइड करना होगा:
onCreateViewHolder():RecyclerViewइस तरीके को तब कॉल करता है, जब उसे नयाViewHolderबनाना होता है. यह तरीका,ViewHolderऔर उससे जुड़ेViewको बनाता और शुरू करता है. हालांकि, यह व्यू के कॉन्टेंट को नहीं भरता. ऐसा इसलिए, क्योंकिViewHolderको अब तक किसी खास डेटा से बाइंड नहीं किया गया है.onBindViewHolder():RecyclerView, इस तरीके कोViewHolderको डेटा से जोड़ने के लिए कॉल करता है. यह तरीका, सही डेटा फ़ेच करता है और व्यू होल्डर के लेआउट को भरने के लिए उस डेटा का इस्तेमाल करता है. उदाहरण के लिए, अगरRecyclerViewनामों की सूची दिखाता है, तो यह तरीका सूची में सही नाम ढूंढ सकता है और व्यू होल्डर'sTextViewविजेट को भर सकता है.getItemCount():RecyclerView, इस तरीके को डेटासेट का साइज़ पाने के लिए कॉल करता है. उदाहरण के लिए, किसी पता पुस्तिका वाले ऐप्लिकेशन में, यह पतों की कुल संख्या हो सकती है. RecyclerView, इसका इस्तेमाल यह तय करने के लिए करता है कि अब कोई आइटम नहीं दिखाया जा सकता.
यहां, नेस्ट किए गए ViewHolder वाले एक सामान्य अडैप्टर का उदाहरण दिया गया है. यह अडैप्टर, डेटा की सूची दिखाता है. इस मामले में, RecyclerView टेक्स्ट एलिमेंट की एक सामान्य सूची दिखाता है. अडैप्टर को स्ट्रिंग की एक ऐसी कैटगरी पास की जाती है जिसमें ViewHolder एलिमेंट के लिए टेक्स्ट होता है.
Kotlin
class CustomAdapter(private val dataSet: Array<String>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() { /** * Provide a reference to the type of views that you are using * (custom ViewHolder) */ class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val textView: TextView init { // Define click listener for the ViewHolder's View textView = view.findViewById(R.id.textView) } } // Create new views (invoked by the layout manager) override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder { // Create a new view, which defines the UI of the list item val view = LayoutInflater.from(viewGroup.context) .inflate(R.layout.text_row_item, viewGroup, false) return ViewHolder(view) } // Replace the contents of a view (invoked by the layout manager) override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { // Get element from your dataset at this position and replace the // contents of the view with that element viewHolder.textView.text = dataSet[position] } // Return the size of your dataset (invoked by the layout manager) override fun getItemCount() = dataSet.size }
Java
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { private String[] localDataSet; /** * Provide a reference to the type of views that you are using * (custom ViewHolder) */ public static class ViewHolder extends RecyclerView.ViewHolder { private final TextView textView; public ViewHolder(View view) { super(view); // Define click listener for the ViewHolder's View textView = (TextView) view.findViewById(R.id.textView); } public TextView getTextView() { return textView; } } /** * Initialize the dataset of the Adapter * * @param dataSet String[] containing the data to populate views to be used * by RecyclerView */ public CustomAdapter(String[] dataSet) { localDataSet = dataSet; } // Create new views (invoked by the layout manager) @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { // Create a new view, which defines the UI of the list item View view = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.text_row_item, viewGroup, false); return new ViewHolder(view); } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder viewHolder, final int position) { // Get element from your dataset at this position and replace the // contents of the view with that element viewHolder.getTextView().setText(localDataSet[position]); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return localDataSet.length; } }
हर व्यू आइटम का लेआउट, आम तौर पर एक्सएमएल लेआउट फ़ाइल में तय किया जाता है.
इस मामले में, ऐप्लिकेशन में text_row_item.xml फ़ाइल इस तरह होती है:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/list_item_height"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:gravity="center_vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/element_text"/>
</FrameLayout>
अगले चरण
यहां दिए गए कोड स्निपेट में, RecyclerView का इस्तेमाल करने का तरीका बताया गया है.
Kotlin
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val dataset = arrayOf("January", "February", "March") val customAdapter = CustomAdapter(dataset) val recyclerView: RecyclerView = findViewById(R.id.recycler_view) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = customAdapter } }
Java
RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.layoutManager = new LinearLayoutManager(this) recyclerView.setAdapter(customAdapter);
लाइब्रेरी, आपके लागू करने के तरीके को पसंद के मुताबिक बनाने के कई तरीके भी उपलब्ध कराती है. ज़्यादा जानकारी के लिए, RecyclerView को बेहतर तरीके से पसंद के मुताबिक बनाना लेख पढ़ें.
एज-टू-एज डिसप्ले की सेटिंग चालू करना
RecyclerView के लिए एज-टू-एज डिसप्ले की सेटिंग चालू करने के लिए, यह तरीका अपनाएं:
- `
enableEdgeToEdge()` को कॉल करके, पुराने सिस्टम के साथ काम करने वाले एज-टू-एज डिसप्ले की सेटिंग चालू करें. - अगर सूची के आइटम, शुरू में सिस्टम बार पर ओवरलैप करते हैं, तो
RecyclerViewपर इनसेट लागू करें. ऐसा करने के लिए,android:fitsSystemWindowsकोtrueपर सेट करें याViewCompat.setOnApplyWindowInsetsListenerका इस्तेमाल करें. - स्क्रोल करते समय, सूची के आइटम को सिस्टम बार के नीचे दिखाने की अनुमति देने के लिए,
android:clipToPaddingकोfalseपरRecyclerViewपर सेट करें.
यहां दिए गए वीडियो में, RecyclerView दिखाया गया है. इसमें एज-टू-एज डिसप्ले की सेटिंग बंद (बाईं ओर) और चालू (दाईं ओर) है:
इनसेट कोड का उदाहरण:
Kotlin
ViewCompat.setOnApplyWindowInsetsListener( findViewById(R.id.my_recycler_view) ) { v, insets -> val innerPadding = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout() // If using EditText, also add // "or WindowInsetsCompat.Type.ime()" to // maintain focus when opening the IME ) v.setPadding( innerPadding.left, innerPadding.top, innerPadding.right, innerPadding.bottom) insets }
Java
ViewCompat.setOnApplyWindowInsetsListener( activity.findViewById(R.id.my_recycler_view), (v, insets) -> { Insets innerPadding = insets.getInsets( WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout() // If using EditText, also add // "| WindowInsetsCompat.Type.ime()" to // maintain focus when opening the IME ); v.setPadding( innerPadding.left, innerPadding.top, innerPadding.right, innerPadding.bottom ); return insets; } );
RecyclerView एक्सएमएल:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:clipToPadding="false"
android:layout_width="match_parent"
android:layout_height="match_parent" />
अन्य संसाधन
Android पर टेस्टिंग के बारे में ज़्यादा जानने के लिए, ये संसाधन देखें.