অ্যান্ড্রয়েড জেটপ্যাকের রিসাইক্লারভিউ অংশ দিয়ে গতিশীল তালিকা তৈরি করুন।
RecyclerView দক্ষতার সাথে ডেটার বড় সেট প্রদর্শন করা সহজ করে তোলে। আপনি ডেটা সরবরাহ করেন এবং প্রতিটি আইটেমকে কীভাবে দেখায় তা সংজ্ঞায়িত করেন এবং যখন প্রয়োজন হয় তখন RecyclerView লাইব্রেরি গতিশীলভাবে উপাদানগুলি তৈরি করে।
নামটি বোঝায়, RecyclerView সেই পৃথক উপাদানগুলিকে পুনর্ব্যবহার করে । যখন একটি আইটেম পর্দা বন্ধ স্ক্রোল, RecyclerView এর দৃশ্য ধ্বংস করে না। পরিবর্তে, RecyclerView নতুন আইটেমগুলির জন্য দৃশ্যটি পুনঃব্যবহার করে যা অনস্ক্রীনে স্ক্রোল করা হয়েছে। RecyclerView কর্মক্ষমতা এবং আপনার অ্যাপের প্রতিক্রিয়াশীলতা উন্নত করে এবং এটি পাওয়ার খরচ কমায়।
মূল ক্লাস
আপনার গতিশীল তালিকা তৈরি করতে বেশ কয়েকটি ক্লাস একসাথে কাজ করে।
RecyclerViewহলViewGroupযেটিতে আপনার ডেটার সাথে সম্পর্কিত ভিউ রয়েছে। এটি নিজেই একটি দৃশ্য, তাই আপনি আপনার লেআউটেRecyclerViewযোগ করেন যেভাবে আপনি অন্য কোনো UI উপাদান যোগ করবেন।তালিকার প্রতিটি পৃথক উপাদান একটি ভিউ হোল্ডার অবজেক্ট দ্বারা সংজ্ঞায়িত করা হয়। যখন ভিউ হোল্ডার তৈরি করা হয়, তখন এটির সাথে যুক্ত কোনো ডেটা থাকে না। ভিউ হোল্ডার তৈরি হওয়ার পরে,
RecyclerViewএটিকে তার ডেটাতে আবদ্ধ করে । আপনিRecyclerView.ViewHolderপ্রসারিত করে ভিউ হোল্ডারকে সংজ্ঞায়িত করেন।RecyclerViewভিউ অনুরোধ করে এবং অ্যাডাপ্টারে পদ্ধতি কল করে ভিউগুলিকে তাদের ডেটাতে আবদ্ধ করে। আপনিRecyclerView.Adapterপ্রসারিত করে অ্যাডাপ্টার সংজ্ঞায়িত করেন।লেআউট ম্যানেজার আপনার তালিকার পৃথক উপাদানগুলিকে সাজায়। আপনি RecyclerView লাইব্রেরি দ্বারা প্রদত্ত লেআউট ম্যানেজারগুলির একটি ব্যবহার করতে পারেন, অথবা আপনি আপনার নিজের সংজ্ঞায়িত করতে পারেন। লেআউট ম্যানেজাররা সবই লাইব্রেরির
LayoutManagerঅ্যাবস্ট্রাক্ট ক্লাসের উপর ভিত্তি করে।
রিসাইক্লারভিউ স্যাম্পল অ্যাপ (কোটলিন) বা রিসাইক্লারভিউ স্যাম্পল অ্যাপ (জাভা) -এ আপনি দেখতে পারেন কিভাবে সমস্ত টুকরো একসাথে ফিট করে।
আপনার RecyclerView বাস্তবায়নের জন্য পদক্ষেপ
আপনি যদি RecyclerView ব্যবহার করতে যাচ্ছেন, তাহলে আপনাকে কিছু জিনিস করতে হবে। তারা নিম্নলিখিত বিভাগে বিস্তারিতভাবে ব্যাখ্যা করা হয়.
তালিকা বা গ্রিড দেখতে কেমন তা নির্ধারণ করুন। সাধারণত, আপনি RecyclerView লাইব্রেরির স্ট্যান্ডার্ড লেআউট ম্যানেজারগুলির একটি ব্যবহার করতে পারেন।
তালিকার প্রতিটি উপাদান কীভাবে দেখায় এবং আচরণ করে তা ডিজাইন করুন। এই নকশার উপর ভিত্তি করে,
ViewHolderক্লাস প্রসারিত করুন। আপনারViewHolderসংস্করণ আপনার তালিকা আইটেমগুলির জন্য সমস্ত কার্যকারিতা প্রদান করে। আপনার ভিউ হোল্ডার হল একটিViewচারপাশে একটি মোড়ক, এবং সেই ভিউটিRecyclerViewদ্বারা পরিচালিত হয়।Adapterসংজ্ঞায়িত করুন যাViewHolderদর্শনের সাথে আপনার ডেটা সংযুক্ত করে।
এছাড়াও উন্নত কাস্টমাইজেশন বিকল্প রয়েছে যা আপনাকে আপনার রিসাইক্লারভিউকে আপনার সঠিক প্রয়োজন অনুসারে তৈরি করতে দেয়।
আপনার লেআউট পরিকল্পনা
আপনার RecyclerView-এর আইটেমগুলি একটি LayoutManager ক্লাস দ্বারা সাজানো হয়েছে। RecyclerView লাইব্রেরি তিনটি লেআউট ম্যানেজার প্রদান করে, যা সবচেয়ে সাধারণ লেআউট পরিস্থিতি পরিচালনা করে:
-
LinearLayoutManagerআইটেমগুলিকে এক-মাত্রিক তালিকায় সাজায়। -
GridLayoutManagerএকটি দ্বি-মাত্রিক গ্রিডে আইটেমগুলি সাজায়:- যদি গ্রিডটি উল্লম্বভাবে সাজানো হয়,
GridLayoutManagerচেষ্টা করে প্রতিটি সারির সমস্ত উপাদানের প্রস্থ এবং উচ্চতা একই, কিন্তু বিভিন্ন সারির উচ্চতা ভিন্ন হতে পারে। - যদি গ্রিড অনুভূমিকভাবে সাজানো হয়,
GridLayoutManagerচেষ্টা করে প্রতিটি কলামের সমস্ত উপাদানের প্রস্থ এবং উচ্চতা একই, কিন্তু বিভিন্ন কলামের বিভিন্ন প্রস্থ থাকতে পারে।
- যদি গ্রিডটি উল্লম্বভাবে সাজানো হয়,
-
StaggeredGridLayoutManagerGridLayoutManagerএর মতোই, কিন্তু এটির প্রয়োজন নেই যে একটি সারিতে থাকা আইটেমগুলির একই উচ্চতা (উল্লম্ব গ্রিডের জন্য) বা একই কলামের আইটেমগুলির প্রস্থ একই (অনুভূমিক গ্রিডের জন্য)। ফলাফল হল যে একটি সারি বা কলামের আইটেমগুলি একে অপরের থেকে অফসেট শেষ করতে পারে।
আপনাকে পৃথক আইটেমগুলির বিন্যাসও ডিজাইন করতে হবে। আপনি যখন ভিউ হোল্ডার ডিজাইন করবেন তখন আপনার এই লেআউটটি প্রয়োজন, যেমনটি পরবর্তী বিভাগে বর্ণনা করা হয়েছে।
আপনার অ্যাডাপ্টার এবং ভিউ হোল্ডার প্রয়োগ করুন
একবার আপনি আপনার লেআউট নির্ধারণ করলে, আপনাকে আপনার Adapter এবং ViewHolder বাস্তবায়ন করতে হবে। আপনার ডেটা কীভাবে প্রদর্শিত হবে তা নির্ধারণ করতে এই দুটি শ্রেণী একসাথে কাজ করে। ViewHolder হল একটি View চারপাশে একটি মোড়ক যাতে তালিকার একটি পৃথক আইটেমের বিন্যাস থাকে। Adapter প্রয়োজন অনুযায়ী ViewHolder অবজেক্ট তৈরি করে এবং সেই ভিউগুলির জন্য ডেটাও সেট করে। তাদের ডেটার সাথে ভিউ যুক্ত করার প্রক্রিয়াটিকে বাইন্ডিং বলা হয়।
যখন আপনি আপনার অ্যাডাপ্টার সংজ্ঞায়িত করেন, আপনি তিনটি মূল পদ্ধতি ওভাররাইড করেন:
onCreateViewHolder():RecyclerViewএই পদ্ধতিটিকে কল করে যখনই এটি একটি নতুনViewHolderতৈরি করতে হয়। পদ্ধতিটিViewHolderএবং এর সাথে সম্পর্কিতViewতৈরি করে এবং শুরু করে, কিন্তু ভিউ-এর বিষয়বস্তু পূরণ করে না —ViewHolderএখনও নির্দিষ্ট ডেটার সাথে আবদ্ধ হয়নি।onBindViewHolder():RecyclerViewডেটার সাথে একটিViewHolderসংযুক্ত করতে এই পদ্ধতিটিকে কল করে। পদ্ধতিটি উপযুক্ত ডেটা নিয়ে আসে এবং ভিউ হোল্ডারের লেআউট পূরণ করতে ডেটা ব্যবহার করে। উদাহরণস্বরূপ, যদিRecyclerViewনামের একটি তালিকা প্রদর্শন করে, তবে পদ্ধতিটি তালিকায় উপযুক্ত নাম খুঁজে পেতে পারে এবং ভিউ হোল্ডারেরTextViewউইজেটটি পূরণ করতে পারে।getItemCount():RecyclerViewডেটাসেটের আকার পেতে এই পদ্ধতিটিকে কল করে। উদাহরণস্বরূপ, একটি ঠিকানা বই অ্যাপে, এটি ঠিকানার মোট সংখ্যা হতে পারে। RecyclerView এটি ব্যবহার করে তা নির্ধারণ করতে কখন আর কোন আইটেম প্রদর্শিত হবে না।
এখানে নেস্টেড ViewHolder সহ একটি সাধারণ অ্যাডাপ্টারের একটি সাধারণ উদাহরণ যা ডেটার একটি তালিকা প্রদর্শন করে। এই ক্ষেত্রে, RecyclerView পাঠ্য উপাদানগুলির একটি সহজ তালিকা প্রদর্শন করে। অ্যাডাপ্টারটি ViewHolder উপাদানগুলির জন্য পাঠ্য ধারণকারী স্ট্রিংগুলির একটি অ্যারে পাস করেছে।
কোটলিন
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 }
জাভা
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; } }
প্রতিটি ভিউ আইটেমের লেআউট যথারীতি একটি XML লেআউট ফাইলে সংজ্ঞায়িত করা হয়। এই ক্ষেত্রে, অ্যাপটির একটি 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 ব্যবহার করতে পারেন।
কোটলিন
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 } }
জাভা
RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.layoutManager = new LinearLayoutManager(this) recyclerView.setAdapter(customAdapter);
লাইব্রেরি আপনার বাস্তবায়ন কাস্টমাইজ করার অনেক উপায়ও অফার করে। আরও তথ্যের জন্য, অ্যাডভান্সড রিসাইক্লারভিউ কাস্টমাইজেশন দেখুন।
এজ-টু-এজ ডিসপ্লে সক্ষম করুন
RecyclerView এর জন্য এজ-টু-এজ ডিসপ্লে সক্ষম করতে এই পদক্ষেপগুলি অনুসরণ করুন:
-
enableEdgeToEdge()কল করে একটি পশ্চাদগামী সামঞ্জস্যপূর্ণ প্রান্ত থেকে প্রান্ত প্রদর্শন সেট আপ করুন৷ - তালিকার আইটেমগুলি প্রাথমিকভাবে সিস্টেম বারগুলিকে ওভারল্যাপ করলে,
RecyclerViewএ ইনসেটগুলি প্রয়োগ করুন। আপনিandroid:fitsSystemWindowstrueসেট করে বাViewCompat.setOnApplyWindowInsetsListenerব্যবহার করে এটি করতে পারেন। -
RecyclerViewএandroid:clipToPaddingfalseসেট করে স্ক্রোল করার সময় তালিকার আইটেমগুলিকে সিস্টেম বারের নিচে আঁকার অনুমতি দিন।
নিচের ভিডিওটিতে এজ-টু-এজ ডিসপ্লে অক্ষম (বামে) এবং সক্ষম (ডান) সহ একটি RecyclerView দেখায়:
উদাহরণ ইনসেট কোড:
কোটলিন
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 }
জাভা
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" />
অতিরিক্ত সম্পদ
অ্যান্ড্রয়েড পরীক্ষা সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন৷
