এই কোডল্যাবটি অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোর্সের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।
ভূমিকা
এই কোডল্যাব আপনাকে আইটেমগুলির তালিকা প্রদর্শন করার জন্য একটি RecyclerView ব্যবহার করতে শেখায়। কোডল্যাবগুলির পূর্ববর্তী সিরিজ থেকে স্লিপ-ট্র্যাকার অ্যাপ তৈরি করে, আপনি একটি প্রস্তাবিত আর্কিটেকচার সহ একটি RecyclerView ব্যবহার করে ডেটা প্রদর্শনের আরও ভাল এবং বহুমুখী উপায় শিখতে পারেন।
আপনি ইতিমধ্যে কি জানা উচিত
আপনার সাথে পরিচিত হওয়া উচিত:
- একটি ক্রিয়াকলাপ, টুকরো এবং দৃশ্য ব্যবহার করে একটি মৌলিক ব্যবহারকারী ইন্টারফেস (UI) তৈরি করা।
- টুকরোগুলির মধ্যে নেভিগেট করা এবং টুকরোগুলির মধ্যে ডেটা পাস করতে
safeArgsব্যবহার করে৷ - ভিউ মডেল ব্যবহার করে, মডেল ফ্যাক্টরি, রূপান্তর এবং
LiveDataএবং তাদের পর্যবেক্ষক দেখুন। - একটি
Roomডাটাবেস তৈরি করা, একটি DAO তৈরি করা এবং সত্তাকে সংজ্ঞায়িত করা। - ডাটাবেস কাজ এবং অন্যান্য দীর্ঘ-চলমান কাজের জন্য কোরোটিন ব্যবহার করা।
আপনি কি শিখবেন
- আইটেমগুলির একটি তালিকা প্রদর্শন করতে
Adapterএবং একটিViewHolderসহ একটিRecyclerViewকীভাবে ব্যবহার করবেন।
আপনি কি করবেন
- ঘুম-গুণমান ডেটা প্রদর্শন করতে একটি
RecyclerViewব্যবহার করতে পূর্ববর্তী পাঠ থেকে TrackMySleepQuality অ্যাপটি পরিবর্তন করুন।
এই কোডল্যাবে, আপনি একটি অ্যাপের RecyclerView অংশ তৈরি করেন যা ঘুমের গুণমান ট্র্যাক করে। অ্যাপটি সময়ের সাথে সাথে ঘুমের ডেটা সংরক্ষণ করতে একটি Room ডাটাবেস ব্যবহার করে।
স্টার্টার স্লিপ-ট্র্যাকার অ্যাপটিতে দুটি স্ক্রীন রয়েছে, যা খন্ড দ্বারা উপস্থাপিত হয়, যেমনটি নীচের চিত্রে দেখানো হয়েছে।

বাম দিকে দেখানো প্রথম স্ক্রিনে ট্র্যাকিং শুরু এবং বন্ধ করার জন্য বোতাম রয়েছে৷ এই স্ক্রিনটি ব্যবহারকারীর ঘুমের সমস্ত ডেটাও দেখায়। ক্লিয়ার বোতামটি স্থায়ীভাবে সমস্ত ডেটা মুছে দেয় যা অ্যাপ ব্যবহারকারীর জন্য সংগ্রহ করেছে। দ্বিতীয় স্ক্রীন, ডানদিকে দেখানো হয়েছে, ঘুমের মানের রেটিং নির্বাচন করার জন্য।
এই অ্যাপটি একটি UI কন্ট্রোলার, ViewModel এবং LiveData সহ একটি সরলীকৃত আর্কিটেকচার ব্যবহার করে৷ ঘুমের ডেটা স্থায়ী করতে অ্যাপটি একটি Room ডাটাবেসও ব্যবহার করে।

প্রথম স্ক্রিনে প্রদর্শিত ঘুমের রাতের তালিকা কার্যকরী, কিন্তু সুন্দর নয়। অ্যাপটি টেক্সট ভিউ এবং মানের জন্য সংখ্যার জন্য টেক্সট স্ট্রিং তৈরি করতে একটি জটিল ফর্ম্যাটার ব্যবহার করে। এছাড়াও, এই নকশা স্কেল না. আপনি এই কোডল্যাবে এই সমস্ত সমস্যাগুলি ঠিক করার পরে, চূড়ান্ত অ্যাপটির কার্যকারিতা একই থাকে এবং প্রধান স্ক্রীনটি এইরকম দেখায়:

ডেটার একটি তালিকা বা গ্রিড প্রদর্শন করা অ্যান্ড্রয়েডের সবচেয়ে সাধারণ UI কাজগুলির মধ্যে একটি। তালিকাগুলি সহজ থেকে খুব জটিল পর্যন্ত পরিবর্তিত হয়। পাঠ্য দর্শনের একটি তালিকা সহজ ডেটা দেখাতে পারে, যেমন একটি কেনাকাটা তালিকা। একটি জটিল তালিকা, যেমন অবকাশের গন্তব্যগুলির একটি টীকাযুক্ত তালিকা, ব্যবহারকারীকে শিরোনাম সহ একটি স্ক্রলিং গ্রিডের মধ্যে অনেক বিবরণ দেখাতে পারে।
এই সমস্ত ব্যবহারের ক্ষেত্রে সমর্থন করার জন্য, Android RecyclerView উইজেট প্রদান করে।

RecyclerView এর সবচেয়ে বড় সুবিধা হল যে এটি বড় তালিকার জন্য খুবই দক্ষ:
- ডিফল্টরূপে,
RecyclerViewশুধুমাত্র স্ক্রিনে দৃশ্যমান আইটেমগুলি প্রক্রিয়া বা আঁকার জন্য কাজ করে। উদাহরণস্বরূপ, যদি আপনার তালিকায় এক হাজার উপাদান থাকে কিন্তু শুধুমাত্র 10টি উপাদান দৃশ্যমান হয়, তাহলেRecyclerViewস্ক্রিনে 10টি আইটেম আঁকার জন্য যথেষ্ট কাজ করে। যখন ব্যবহারকারী স্ক্রল করে,RecyclerViewস্ক্রিনে নতুন আইটেমগুলি থাকা উচিত তা নির্ধারণ করে এবং সেই আইটেমগুলি প্রদর্শন করার জন্য যথেষ্ট কাজ করে। - যখন একটি আইটেম স্ক্রীন থেকে স্ক্রোল করে, তখন আইটেমের ভিউ পুনর্ব্যবহৃত হয়। এর মানে আইটেমটি নতুন সামগ্রী দিয়ে পূর্ণ যা স্ক্রিনে স্ক্রোল করে। এই
RecyclerViewআচরণ প্রক্রিয়াকরণের অনেক সময় বাঁচায় এবং তালিকাগুলিকে ফ্লুইডলি স্ক্রোল করতে সাহায্য করে। - যখন একটি আইটেম পরিবর্তিত হয়, সমগ্র তালিকা পুনরায় আঁকার পরিবর্তে,
RecyclerViewসেই একটি আইটেম আপডেট করতে পারে। জটিল আইটেমগুলির তালিকা প্রদর্শন করার সময় এটি একটি বিশাল দক্ষতা লাভ!
নীচে দেখানো ক্রমটিতে, আপনি দেখতে পাচ্ছেন যে একটি ভিউ ডেটা দিয়ে পূর্ণ হয়েছে, ABC । সেই ভিউটি স্ক্রিন বন্ধ করার পরে, RecyclerView নতুন ডেটা, XYZ জন্য ভিউটি পুনরায় ব্যবহার করে।

অ্যাডাপ্টারের প্যাটার্ন
আপনি যদি কখনও বিভিন্ন বৈদ্যুতিক সকেট ব্যবহার করে এমন দেশগুলির মধ্যে ভ্রমণ করেন তবে আপনি সম্ভবত জানেন কিভাবে আপনি অ্যাডাপ্টার ব্যবহার করে আপনার ডিভাইসগুলিকে আউটলেটগুলিতে প্লাগ করতে পারেন৷ অ্যাডাপ্টার আপনাকে এক ধরণের প্লাগকে অন্যটিতে রূপান্তর করতে দেয়, যা সত্যিই একটি ইন্টারফেসকে অন্যটিতে রূপান্তর করে।
সফ্টওয়্যার প্রকৌশলে অ্যাডাপ্টার প্যাটার্ন একটি বস্তুকে অন্য API এর সাথে কাজ করতে সহায়তা করে। RecyclerView অ্যাপ ডেটাকে এমন কিছুতে রূপান্তর করতে একটি অ্যাডাপ্টার ব্যবহার করে যা RecyclerView প্রদর্শন করতে পারে, অ্যাপ কীভাবে ডেটা সঞ্চয় করে এবং প্রক্রিয়া করে তা পরিবর্তন না করে। স্লিপ-ট্র্যাকার অ্যাপের জন্য, আপনি একটি অ্যাডাপ্টার তৈরি করেন যা Room ডাটাবেস থেকে এমন কিছুতে ডেটা গ্রহণ করে যা RecyclerView জানে কিভাবে প্রদর্শন করতে হয়, ViewModel পরিবর্তন না করে।
একটি রিসাইক্লারভিউ বাস্তবায়ন করা

একটি RecyclerView এ আপনার ডেটা প্রদর্শন করতে, আপনার নিম্নলিখিত অংশগুলির প্রয়োজন:
- প্রদর্শনের জন্য ডেটা।
- আপনার লেআউট ফাইলে সংজ্ঞায়িত একটি
RecyclerViewদৃষ্টান্ত, ভিউগুলির ধারক হিসাবে কাজ করতে। - ডেটার একটি আইটেমের জন্য একটি বিন্যাস।
যদি সমস্ত তালিকা আইটেম একই দেখায়, আপনি তাদের সকলের জন্য একই বিন্যাস ব্যবহার করতে পারেন, তবে এটি বাধ্যতামূলক নয়। আইটেম লেআউটটি ফ্র্যাগমেন্টের লেআউট থেকে আলাদাভাবে তৈরি করতে হবে, যাতে একবারে একটি আইটেম ভিউ তৈরি করা যায় এবং ডেটা দিয়ে পূর্ণ করা যায়। - একজন লেআউট ম্যানেজার।
লেআউট ম্যানেজার একটি দৃশ্যে UI উপাদানগুলির সংগঠন (লেআউট) পরিচালনা করে। - একটি ভিউ হোল্ডার।
ভিউ হোল্ডারViewHolderক্লাস প্রসারিত করে। এতে আইটেমের বিন্যাস থেকে একটি আইটেম প্রদর্শনের জন্য ভিউ তথ্য রয়েছে। ভিউ হোল্ডাররাও তথ্য যোগ করে যাRecyclerViewব্যবহার করে দক্ষতার সাথে স্ক্রীনের চারপাশে ভিউ সরাতে। - একটি অ্যাডাপ্টার।
অ্যাডাপ্টারটি আপনার ডেটাকেRecyclerViewসাথে সংযুক্ত করে। এটি ডেটাকে অভিযোজিত করে যাতে এটি একটিViewHolderপ্রদর্শিত হতে পারে। একটিRecyclerViewকীভাবে স্ক্রিনে ডেটা প্রদর্শন করতে হয় তা বের করতে অ্যাডাপ্টার ব্যবহার করে।
এই টাস্কে, আপনি আপনার লেআউট ফাইলে একটি RecyclerView যোগ করুন এবং RecyclerView এ ঘুমের ডেটা প্রকাশ করতে একটি Adapter সেট আপ করুন।
ধাপ 1: LayoutManager এর সাথে RecyclerView যোগ করুন
এই ধাপে, আপনি fragment_sleep_tracker.xml ফাইলে একটি RecyclerView দিয়ে ScrollView প্রতিস্থাপন করুন।
- GitHub থেকে RecyclerViewFundamentals-Starter অ্যাপ ডাউনলোড করুন।
- অ্যাপটি তৈরি করুন এবং চালান। লক্ষ্য করুন কিভাবে ডেটা সহজ পাঠ্য হিসাবে প্রদর্শিত হয়।
- Android স্টুডিওতে ডিজাইন ট্যাবে
fragment_sleep_tracker.xmlলেআউট ফাইলটি খুলুন। - কম্পোনেন্ট ট্রি প্যানে,
ScrollViewমুছুন। এই ক্রিয়াটিScrollViewএর ভিতরে থাকাTextViewটিকেও মুছে দেয়। - প্যালেট প্যানে, কন্টেনারগুলি খুঁজে পেতে বাম দিকে উপাদান প্রকারের তালিকার মাধ্যমে স্ক্রোল করুন, তারপর এটি নির্বাচন করুন।
- প্যালেট ফলক থেকে কম্পোনেন্ট ট্রি প্যানে একটি
RecyclerViewটেনে আনুন।RecyclerViewConstraintLayoutভিতরে রাখুন।

- আপনি একটি নির্ভরতা যোগ করতে চান কিনা তা জিজ্ঞাসা করে যদি একটি ডায়ালগ খোলে, তাহলে অ্যান্ড্রয়েড স্টুডিওকে আপনার গ্রেডল ফাইলে
recyclerviewনির্ভরতা যোগ করতে দিতে ওকে ক্লিক করুন। এটি কয়েক সেকেন্ড সময় নিতে পারে এবং তারপরে আপনার অ্যাপ সিঙ্ক হয়।

- মডিউল
build.gradleফাইলটি খুলুন, শেষ পর্যন্ত স্ক্রোল করুন, এবং নতুন নির্ভরতা নোট করুন, যা নীচের কোডের মতো দেখাচ্ছে:
implementation 'androidx.recyclerview:recyclerview:1.0.0'
-
fragment_sleep_tracker.xmlএ ফিরে যান। - পাঠ্য ট্যাবে, নীচে দেখানো
RecyclerViewকোডটি সন্ধান করুন:
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent" />-
RecyclerViewsleep_listএর একটিidদিন।
android:id="@+id/sleep_list"-
ConstraintLayoutএর ভিতরে স্ক্রীনের অবশিষ্ট অংশ নিতেRecyclerViewঅবস্থান করুন। এটি করার জন্য,RecyclerViewএর উপরের অংশটিকে স্টার্ট বোতামে, নীচের অংশটি ক্লিয়ার বোতামে এবং প্রতিটি পাশ অভিভাবকের কাছে সীমাবদ্ধ করুন৷ নিচের কোডটি ব্যবহার করে লেআউট এডিটর বা XML-এ লেআউটের প্রস্থ এবং উচ্চতা 0 dp এ সেট করুন:
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/clear_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/stop_button"-
RecyclerViewXML-এ একটি লেআউট ম্যানেজার যোগ করুন। প্রতিটিRecyclerViewএকটি লেআউট ম্যানেজার প্রয়োজন যা এটিকে বলে যে কীভাবে তালিকায় আইটেমগুলিকে অবস্থান করতে হয়। Android একটিLinearLayoutManagerপ্রদান করে, যা ডিফল্টরূপে আইটেমগুলিকে সম্পূর্ণ প্রস্থের সারির একটি উল্লম্ব তালিকায় রাখে।
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"- ডিজাইন ট্যাবে স্যুইচ করুন এবং লক্ষ্য করুন যে অতিরিক্ত সীমাবদ্ধতার কারণে
RecyclerViewউপলব্ধ স্থান পূরণ করতে প্রসারিত হয়েছে।

ধাপ 2: তালিকা আইটেম লেআউট এবং টেক্সট ভিউ হোল্ডার তৈরি করুন
RecyclerView শুধুমাত্র একটি ধারক। এই ধাপে, আপনি RecyclerView ভিতরে প্রদর্শিত আইটেমগুলির জন্য বিন্যাস এবং অবকাঠামো তৈরি করেন।
যত তাড়াতাড়ি সম্ভব একটি কার্যকরী RecyclerView যাওয়ার জন্য, প্রথমে আপনি একটি সরল তালিকা আইটেম ব্যবহার করুন যা শুধুমাত্র একটি সংখ্যা হিসাবে ঘুমের গুণমান প্রদর্শন করে। এর জন্য, আপনার একটি ভিউ হোল্ডার প্রয়োজন, TextItemViewHolder । ডেটার জন্য আপনার একটি ভিউ, একটি TextView প্রয়োজন। (পরবর্তী ধাপে, আপনি ভিউ হোল্ডার এবং সমস্ত ঘুমের ডেটা কীভাবে সাজাতে হয় সে সম্পর্কে আরও শিখবেন।)
-
text_item_view.xmlনামে একটি লেআউট ফাইল তৈরি করুন। আপনি রুট উপাদান হিসাবে কি ব্যবহার করেন তা কোন ব্যাপার না, কারণ আপনি টেমপ্লেট কোড প্রতিস্থাপন করবেন। -
text_item_view.xmlএ, প্রদত্ত সমস্ত কোড মুছে দিন। - শুরুতে এবং শেষে
16dpপ্যাডিং সহ একটিTextViewএবং24spএর একটি পাঠ্য আকার যোগ করুন। প্রস্থ অভিভাবকের সাথে মেলে এবং উচ্চতা বিষয়বস্তু মোড়ানো যাক। যেহেতু এই ভিউটিRecyclerViewভিতরে প্রদর্শিত হয়, তাই আপনাকেViewGroupভিতরে ভিউ রাখতে হবে না।
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:textSize="24sp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />-
Util.ktখুলুন। শেষ পর্যন্ত স্ক্রোল করুন এবং নীচে দেখানো সংজ্ঞা যোগ করুন, যাTextItemViewHolderক্লাস তৈরি করে। শেষ ক্লোজিং ব্রেসের পরে, ফাইলের নীচে কোডটি রাখুন। কোডটিUtil.ktএ যায় কারণ এই ভিউ হোল্ডারটি অস্থায়ী, এবং আপনি পরে এটি প্রতিস্থাপন করবেন।
class TextItemViewHolder(val textView: TextView): RecyclerView.ViewHolder(textView)- আপনাকে অনুরোধ করা হলে,
android.widget.TextViewএবংandroidx.recyclerview.widget.RecyclerViewআমদানি করুন।
ধাপ 3: SleepNightAdapter তৈরি করুন
একটি RecyclerView বাস্তবায়নের মূল কাজটি অ্যাডাপ্টার তৈরি করা। আইটেম দেখার জন্য আপনার কাছে একটি সাধারণ ভিউ ধারক এবং প্রতিটি আইটেমের জন্য একটি বিন্যাস রয়েছে। আপনি এখন একটি অ্যাডাপ্টার তৈরি করতে পারেন। অ্যাডাপ্টার একটি ভিউ হোল্ডার তৈরি করে এবং RecyclerView প্রদর্শনের জন্য ডেটা দিয়ে এটি পূরণ করে।
-
sleeptrackerপ্যাকেজে,SleepNightAdapterনামে একটি নতুন Kotlin ক্লাস তৈরি করুন। -
SleepNightAdapterক্লাস প্রসারিত করুনRecyclerView.Adapter. ক্লাসটিকেSleepNightAdapterবলা হয় কারণ এটি একটিSleepNightঅবজেক্টকে এমন কিছুতে অভিযোজিত করে যাRecyclerViewব্যবহার করতে পারে। কোন ভিউ হোল্ডার ব্যবহার করতে হবে তা অ্যাডাপ্টারের জানতে হবে, তাইTextItemViewHolderএ পাস করুন। অনুরোধ করা হলে প্রয়োজনীয় উপাদানগুলি আমদানি করুন এবং তারপরে আপনি একটি ত্রুটি দেখতে পাবেন, কারণ বাস্তবায়নের জন্য বাধ্যতামূলক পদ্ধতি রয়েছে।
class SleepNightAdapter: RecyclerView.Adapter<TextItemViewHolder>() {}-
SleepNightAdapterএর শীর্ষ স্তরে, ডেটা ধরে রাখতেSleepNightভেরিয়েবলের একটিlistOfতৈরি করুন।
var data = listOf<SleepNight>()-
SleepNightAdapterএ,getItemCount()ওভাররাইড করেdataঘুমের রাতের তালিকার আকার ফেরত দিন।RecyclerViewজানতে হবে অ্যাডাপ্টারের কতগুলি আইটেম দেখানোর জন্য, এবং এটিgetItemCount()কল করে তা করে।
override fun getItemCount() = data.size-
SleepNightAdapterএ,onBindViewHolder()ফাংশনটি ওভাররাইড করুন, যেমনটি নীচে দেখানো হয়েছে।
onBindViewHolder()ফাংশনটিকেRecyclerViewদ্বারা বলা হয় নির্দিষ্ট অবস্থানে একটি তালিকা আইটেমের জন্য ডেটা প্রদর্শন করতে। তাইonBindViewHolder()পদ্ধতিতে দুটি আর্গুমেন্ট লাগে: একটি ভিউ হোল্ডার, এবং ডাটার একটি পজিশন আবদ্ধ করার জন্য। এই অ্যাপের জন্য, ধারক হলTextItemViewHolder, এবং পজিশন হল তালিকার অবস্থান৷
override fun onBindViewHolder(holder: TextItemViewHolder, position: Int) {
}-
onBindViewHolder()ভিতরে, ডেটাতে একটি নির্দিষ্ট অবস্থানে একটি আইটেমের জন্য একটি ভেরিয়েবল তৈরি করুন।
val item = data[position]- আপনার তৈরি করা
ViewHoldertextViewনামে একটি সম্পত্তি রয়েছে।onBindViewHolder()এর ভিতরে,textView-এরtextঘুম-গুণমানের নম্বরে সেট করুন। এই কোডটি শুধুমাত্র সংখ্যার একটি তালিকা প্রদর্শন করে, কিন্তু এই সাধারণ উদাহরণটি আপনাকে দেখতে দেয় কিভাবে অ্যাডাপ্টার ভিউ হোল্ডার এবং স্ক্রিনে ডেটা পায়।
holder.textView.text = item.sleepQuality.toString()-
SleepNightAdapterএ,onCreateViewHolder()ওভাররাইড করুন এবং প্রয়োগ করুন, যেটিকে বলা হয় যখনRecyclerViewএকটি আইটেম উপস্থাপন করার জন্য একটি ভিউ হোল্ডারের প্রয়োজন হয়।
এই ফাংশনটি দুটি প্যারামিটার নেয় এবং একটিViewHolderপ্রদান করে।parentপ্যারামিটার, যা ভিউ গোষ্ঠী যা ভিউ হোল্ডারকে ধরে রাখে, সর্বদাRecyclerViewহয়। একইRecyclerViewএ একাধিক ভিউ থাকলেviewTypeপ্যারামিটার ব্যবহার করা হয়। উদাহরণস্বরূপ, আপনি যদি একইRecyclerViewএ টেক্সট ভিউ, একটি ছবি এবং একটি ভিডিওর একটি তালিকা রাখেন, তাহলেonCreateViewHolder()ফাংশনটি জানতে হবে কোন ধরনের ভিউ ব্যবহার করতে হবে।
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextItemViewHolder {
}-
onCreateViewHolder()এ,LayoutInflaterএর একটি উদাহরণ তৈরি করুন।
লেআউট ইনফ্লাটার জানে কিভাবে XML লেআউট থেকে ভিউ তৈরি করতে হয়।contextতথ্য রয়েছে কিভাবে সঠিকভাবে ভিউকে স্ফীত করা যায়। একটি রিসাইক্লার ভিউয়ের জন্য অ্যাডাপ্টারে, আপনি সবসময়parentভিউ গ্রুপের প্রেক্ষাপটে পাস করেন, যা হলRecyclerView।
val layoutInflater = LayoutInflater.from(parent.context)onCreateViewHolder()-এ,layoutinflaterস্ফীত করতে বলেviewতৈরি করুন।
ভিউয়ের জন্য XML লেআউট এবং ভিউয়ের জন্যparentভিউ গ্রুপ পাস করুন। তৃতীয়, বুলিয়ান, আর্গুমেন্ট হলattachToRoot। এই যুক্তিটিfalseহওয়া দরকার, কারণRecyclerViewএই আইটেমটিকে আপনার জন্য ভিউ হায়ারার্কিতে যোগ করে যখন এটি সময় হয়৷
val view = layoutInflater
.inflate(R.layout.text_item_view, parent, false) as TextViewonCreateViewHolder()এ,viewদিয়ে তৈরি একটিTextItemViewHolderফেরত দিন।
return TextItemViewHolder(view)- অ্যাডাপ্টারটিকে
RecyclerViewজানাতে হবে যখনdataপরিবর্তিত হয়েছে, কারণRecyclerViewডেটা সম্পর্কে কিছুই জানে না। এটি শুধুমাত্র ভিউ হোল্ডার সম্পর্কে জানে যা অ্যাডাপ্টার এটিকে দেয়।
RecyclerViewজানাতে যখন এটি প্রদর্শিত ডেটা পরিবর্তিত হয়েছে,SleepNightAdapterক্লাসের শীর্ষে থাকাdataভেরিয়েবলে একটি কাস্টম সেটার যুক্ত করুন৷ সেটারে,dataএকটি নতুন মান দিন, তারপরে কল করুনnotifyDataSetChanged()যাতে নতুন ডেটা দিয়ে তালিকাটি পুনরায় অঙ্কন করা যায়৷
var data = listOf<SleepNight>()
set(value) {
field = value
notifyDataSetChanged()
}ধাপ 4: অ্যাডাপ্টার সম্পর্কে রিসাইক্লারভিউকে বলুন
RecyclerView ভিউ হোল্ডার পেতে অ্যাডাপ্টার সম্পর্কে জানতে হবে।
-
SleepTrackerFragment.ktখুলুন। -
onCreateview()এ, একটি অ্যাডাপ্টার তৈরি করুন।ViewModelমডেল তৈরির পরে এবংreturnস্টেটমেন্টের আগে এই কোডটি রাখুন।
val adapter = SleepNightAdapter()-
RecyclerViewএর সাথেadapterসংযুক্ত করুন।
binding.sleepList.adapter = adapter-
bindingঅবজেক্ট আপডেট করতে আপনার প্রোজেক্টটি পরিষ্কার এবং পুনর্নির্মাণ করুন।
আপনি যদি এখনওbinding.sleepListবাbinding.FragmentSleepTrackerBindingএর চারপাশে ত্রুটি দেখতে পান, ক্যাশে বাতিল করুন এবং পুনরায় চালু করুন। ( ফাইল নির্বাচন করুন > ক্যাশে বাতিল করুন / পুনরায় চালু করুন ।)
আপনি যদি এখন অ্যাপটি চালান, কোন ত্রুটি নেই, কিন্তু আপনি স্টার্ট , তারপর থামুন- এ আলতো চাপলে কোনো ডেটা প্রদর্শিত হবে না।
ধাপ 5: অ্যাডাপ্টারে ডেটা পান
এখন পর্যন্ত আপনার কাছে একটি অ্যাডাপ্টার রয়েছে এবং অ্যাডাপ্টার থেকে RecyclerView এ ডেটা পাওয়ার একটি উপায় রয়েছে। এখন আপনাকে ViewModel থেকে অ্যাডাপ্টারে ডেটা পেতে হবে।
-
SleepTrackerViewModelখুলুন। -
nightsপরিবর্তনশীল খুঁজুন, যা সমস্ত ঘুমের রাত সঞ্চয় করে, যা প্রদর্শন করার জন্য ডেটা। ডাটাবেসেgetAllNights()কল করেnightsপরিবর্তনশীল সেট করা হয়। -
nightsথেকেprivateসরান, কারণ আপনি একটি পর্যবেক্ষক তৈরি করবেন যা এই পরিবর্তনশীলটি অ্যাক্সেস করতে হবে। আপনার ঘোষণা এই মত হওয়া উচিত:
val nights = database.getAllNights()-
databaseপ্যাকেজে,SleepDatabaseDaoখুলুন। -
getAllNights()ফাংশন খুঁজুন। লক্ষ্য করুন যে এই ফাংশনটিLiveDataহিসাবেSleepNightমানগুলির একটি তালিকা প্রদান করে। এর মানে হল যেnightsভেরিয়েবলেLiveDataরয়েছে যাRoomদ্বারা আপডেট করা হয় এবং কখন এটি পরিবর্তন হয় তা জানতে আপনিnightsপর্যবেক্ষণ করতে পারেন। -
SleepTrackerFragmentখুলুন। -
onCreateView()এ,adapterতৈরির নীচে,nightsভেরিয়েবলে একটি পর্যবেক্ষক তৈরি করুন।
লাইফসাইকেলের মালিক হিসাবে ফ্র্যাগমেন্টেরviewLifecycleOwnerসরবরাহ করে, আপনি নিশ্চিত করতে পারেন যে এই পর্যবেক্ষকটি শুধুমাত্র সক্রিয় থাকে যখনRecyclerViewস্ক্রিনে থাকে।
sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
})- পর্যবেক্ষকের ভিতরে, যখনই আপনি একটি নন-নাল মান পাবেন (
nightsজন্য), অ্যাডাপ্টারেরdataমান নির্ধারণ করুন। এটি পর্যবেক্ষক এবং ডেটা সেট করার জন্য সম্পূর্ণ কোড:
sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
it?.let {
adapter.data = it
}
})- আপনার কোড তৈরি করুন এবং চালান।
আপনার অ্যাডাপ্টার কাজ করলে আপনি একটি তালিকা হিসাবে ঘুমের মানের সংখ্যা দেখতে পাবেন। আপনি স্টার্ট ট্যাপ করার পরে বাম দিকের স্ক্রিনশটটি -1 দেখায়। আপনি থামুন আলতো চাপার পরে এবং একটি গুণমানের রেটিং নির্বাচন করার পরে ডানদিকের স্ক্রিনশটটি আপডেট করা ঘুম-গুণমানের নম্বর দেখায়।

ধাপ 6: কিভাবে ভিউ হোল্ডার পুনর্ব্যবহৃত হয় তা অন্বেষণ করুন
RecyclerView ভিউ হোল্ডারকে রিসাইকেল করে , যার মানে এটি তাদের পুনরায় ব্যবহার করে। একটি ভিউ স্ক্রীন থেকে স্ক্রোল করার সাথে সাথে, RecyclerView সেই ভিউটির জন্য পুনরায় ব্যবহার করে যা স্ক্রিনে স্ক্রোল করতে চলেছে।
যেহেতু এই ভিউ হোল্ডারগুলি রিসাইকেল করা হয়েছে, নিশ্চিত করুন onBindViewHolder() সেট বা রিসেট করে এমন কোনো কাস্টমাইজেশন যা পূর্ববর্তী আইটেমগুলি ভিউ হোল্ডারে সেট করতে পারে।
উদাহরণ স্বরূপ, আপনি টেক্সট কালার লাল করে সেট করতে পারেন ভিউ হোল্ডার যেগুলোর কোয়ালিটি রেটিং 1-এর কম বা সমান এবং খারাপ ঘুমের প্রতিনিধিত্ব করে।
-
SleepNightAdapterক্লাসে,onBindViewHolder()এর শেষে নিম্নলিখিত কোডটি যোগ করুন।
if (item.sleepQuality <= 1) {
holder.textView.setTextColor(Color.RED) // red
}- অ্যাপটি চালান।
- কিছু কম ঘুমের মানের ডেটা যোগ করুন এবং নম্বরটি লাল।
- যতক্ষণ না আপনি স্ক্রিনে একটি লাল উচ্চ সংখ্যা দেখতে পাচ্ছেন ততক্ষণ ঘুমের মানের জন্য উচ্চ রেটিং যোগ করুন।
যেহেতুRecyclerViewভিউ হোল্ডারদের পুনঃব্যবহার করে, এটি অবশেষে একটি উচ্চ মানের রেটিং এর জন্য লাল ভিউ হোল্ডারগুলির মধ্যে একটিকে পুনরায় ব্যবহার করে। উচ্চ রেটিং ভুলভাবে লাল প্রদর্শিত হয়.

- এটি ঠিক করতে, একটি
elseবিবৃতি যোগ করুন যাতে রঙটি কালোতে সেট করা হয় যদি গুণমানটি একটির চেয়ে কম বা সমান না হয়।
উভয় শর্ত স্পষ্টভাবে, ভিউ হোল্ডার প্রতিটি আইটেমের জন্য সঠিক পাঠ্য রঙ ব্যবহার করবে।
if (item.sleepQuality <= 1) {
holder.textView.setTextColor(Color.RED) // red
} else {
// reset
holder.textView.setTextColor(Color.BLACK) // black
}- অ্যাপটি চালান, এবং সংখ্যার সবসময় সঠিক রঙ থাকা উচিত।
অভিনন্দন! আপনার কাছে এখন একটি সম্পূর্ণ কার্যকরী মৌলিক RecyclerView আছে।
এই টাস্কে, আপনি সাধারণ ভিউ হোল্ডারটিকে এমন একটি দিয়ে প্রতিস্থাপন করুন যা ঘুমের রাতের জন্য আরও ডেটা প্রদর্শন করতে পারে।
আপনি Util.kt এ যে সাধারণ ViewHolder যোগ করেছেন তা শুধু একটি TextItemViewHolder এ একটি TextView র্যাপ করে।
class TextItemViewHolder(val textView: TextView): RecyclerView.ViewHolder(textView)তাহলে কেন RecyclerView শুধুমাত্র একটি TextView সরাসরি ব্যবহার করে না? কোডের এই এক লাইন অনেক কার্যকারিতা প্রদান করে। একটি ViewHolder RecyclerView মধ্যে একটি আইটেম ভিউ এবং তার স্থান সম্পর্কে মেটাডেটা বর্ণনা করে। RecyclerView এই কার্যকারিতার উপর নির্ভর করে ভিউটিকে তালিকার স্ক্রল হিসাবে সঠিকভাবে অবস্থান করতে এবং Adapter আইটেমগুলি যোগ করা বা সরানো হলে ভিউ অ্যানিমেট করার মতো আকর্ষণীয় জিনিসগুলি করতে।
RecyclerView যদি ViewHolder এ সঞ্চিত ভিউ অ্যাক্সেস করতে হয়, তাহলে এটি ভিউ হোল্ডারের itemView প্রপার্টি ব্যবহার করে তা করতে পারে। RecyclerView itemView ব্যবহার করে যখন এটি একটি আইটেমকে স্ক্রিনে প্রদর্শনের জন্য বাঁধাই করে, যখন একটি সীমানার মতো দৃশ্যের চারপাশে সজ্জা অঙ্কন করে এবং অ্যাক্সেসযোগ্যতা বাস্তবায়নের জন্য।
ধাপ 1: আইটেম লেআউট তৈরি করুন
এই ধাপে, আপনি একটি আইটেমের জন্য লেআউট ফাইল তৈরি করুন। লেআউটে ঘুমের মানের জন্য একটি ImageView সহ একটি ConstraintLayout , ঘুমের দৈর্ঘ্যের জন্য একটি TextView এবং পাঠ্য হিসাবে মানের জন্য একটি TextView রয়েছে। যেহেতু আপনি আগে লেআউটগুলি করেছেন, প্রদত্ত XML কোডটি অনুলিপি করুন এবং পেস্ট করুন৷
- একটি নতুন লেআউট রিসোর্স ফাইল তৈরি করুন এবং এটির নাম দিন
list_item_sleep_night। - নীচের কোড দিয়ে ফাইলের সমস্ত কোড প্রতিস্থাপন করুন। তারপরে আপনি যে লেআউটটি তৈরি করেছেন তার সাথে নিজেকে পরিচিত করুন।
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/quality_image"
android:layout_width="@dimen/icon_size"
android:layout_height="60dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@drawable/ic_sleep_5" />
<TextView
android:id="@+id/sleep_length"
android:layout_width="0dp"
android:layout_height="20dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/quality_image"
app:layout_constraintTop_toTopOf="@+id/quality_image"
tools:text="Wednesday" />
<TextView
android:id="@+id/quality_string"
android:layout_width="0dp"
android:layout_height="20dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="@+id/sleep_length"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/sleep_length"
app:layout_constraintTop_toBottomOf="@+id/sleep_length"
tools:text="Excellent!!!" />
</androidx.constraintlayout.widget.ConstraintLayout>- অ্যান্ড্রয়েড স্টুডিওতে ডিজাইন ট্যাবে স্যুইচ করুন। ডিজাইন ভিউতে, আপনার লেআউটটি নীচের বাম দিকের স্ক্রিনশটের মতো দেখাচ্ছে৷ ব্লুপ্রিন্ট ভিউতে, এটি ডানদিকের স্ক্রিনশটের মতো দেখায়।

ধাপ 2: ভিউহোল্ডার তৈরি করুন
-
SleepNightAdapter.ktখুলুন। -
ViewHolderনামকSleepNightAdapterভিতরে একটি ক্লাস করুন এবং এটিRecyclerView.ViewHolderপ্রসারিত করুন।
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){}-
ViewHolderভিতরে, ভিউগুলির রেফারেন্স পান। এইViewHolderআপডেট করবে এমন ভিউগুলির জন্য আপনার একটি রেফারেন্স প্রয়োজন। প্রতিবার যখন আপনি এইViewHolderআবদ্ধ করবেন, আপনাকে চিত্র এবং উভয় পাঠ্য ভিউ অ্যাক্সেস করতে হবে। (আপনি পরে ডেটা বাইন্ডিং ব্যবহার করতে এই কোডটি রূপান্তর করুন।)
val sleepLength: TextView = itemView.findViewById(R.id.sleep_length)
val quality: TextView = itemView.findViewById(R.id.quality_string)
val qualityImage: ImageView = itemView.findViewById(R.id.quality_image)ধাপ 3: SleepNightAdapter-এ ভিউহোল্ডার ব্যবহার করুন
-
SleepNightAdapterসংজ্ঞায়,TextItemViewHolderএর পরিবর্তে, আপনি এইমাত্র তৈরি করাSleepNightAdapter.ViewHolderব্যবহার করুন৷
class SleepNightAdapter: RecyclerView.Adapter<SleepNightAdapter.ViewHolder>() {আপডেট করুন onCreateViewHolder() :
-
ViewHolderফেরত দিতেonCreateViewHolder()এর স্বাক্ষর পরিবর্তন করুন। - সঠিক লেআউট রিসোর্স,
list_item_sleep_nightব্যবহার করতে লেআউট ইনফ্লেটার পরিবর্তন করুন । -
TextViewকাস্ট সরান। - একটি
TextItemViewHolderফেরত দেওয়ার পরিবর্তে, একটিViewHolderফেরত দিন।
এখানে আপডেট করা শেষ হয়েছেonCreateViewHolder()ফাংশন:
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int): ViewHolder {
val layoutInflater =
LayoutInflater.from(parent.context)
val view = layoutInflater
.inflate(R.layout.list_item_sleep_night,
parent, false)
return ViewHolder(view)
}onBindViewHolder() উপর আপডেট করুন :
-
onBindViewHolder()এর স্বাক্ষর পরিবর্তন করুন যাতেholderপ্যারামিটারটিTextItemViewHolderএর পরিবর্তে একটিViewHolderহয়। -
onBindViewHolder()এর ভিতরে,itemসংজ্ঞা ব্যতীত সমস্ত কোড মুছুন। - একটি
valresসংজ্ঞায়িত করুন যা এই দৃশ্যের জন্যresourcesএকটি রেফারেন্স ধারণ করে।
val res = holder.itemView.context.resources-
sleepLengthটেক্সট ভিউ এর টেক্সট সময়কালের জন্য সেট করুন। নীচের কোডটি অনুলিপি করুন, যা একটি ফর্ম্যাটিং ফাংশনকে কল করে যা স্টার্টার কোডের সাথে সরবরাহ করা হয়েছে।
holder.sleepLength.text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, res)- এটি একটি ত্রুটি দেয়, কারণ
convertDurationToFormatted()সংজ্ঞায়িত করা প্রয়োজন।Util.ktখুলুন এবং এর জন্য কোড এবং সংশ্লিষ্ট আমদানিগুলি আনকমেন্ট করুন। ( কোড নির্বাচন করুন > লাইন মন্তব্য সহ মন্তব্য ।) -
onBindViewHolder()-এ ফিরে, গুণমান সেট করতেconvertNumericQualityToString()ব্যবহার করুন।
holder.quality.text= convertNumericQualityToString(item.sleepQuality, res)- আপনাকে ম্যানুয়ালি এই ফাংশনগুলি আমদানি করতে হতে পারে৷
import com.example.android.trackmysleepquality.convertDurationToFormatted
import com.example.android.trackmysleepquality.convertNumericQualityToString- মানের জন্য সঠিক আইকন সেট করুন। স্টার্টার কোডে আপনার জন্য নতুন
ic_sleep_activeআইকন দেওয়া হয়েছে।
holder.qualityImage.setImageResource(when (item.sleepQuality) {
0 -> R.drawable.ic_sleep_0
1 -> R.drawable.ic_sleep_1
2 -> R.drawable.ic_sleep_2
3 -> R.drawable.ic_sleep_3
4 -> R.drawable.ic_sleep_4
5 -> R.drawable.ic_sleep_5
else -> R.drawable.ic_sleep_active
})- এখানে
onBindViewHolder()ফাংশনের আপডেট করা শেষ হয়েছে,ViewHolderজন্য সমস্ত ডেটা সেট করছে:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = data[position]
val res = holder.itemView.context.resources
holder.sleepLength.text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, res)
holder.quality.text= convertNumericQualityToString(item.sleepQuality, res)
holder.qualityImage.setImageResource(when (item.sleepQuality) {
0 -> R.drawable.ic_sleep_0
1 -> R.drawable.ic_sleep_1
2 -> R.drawable.ic_sleep_2
3 -> R.drawable.ic_sleep_3
4 -> R.drawable.ic_sleep_4
5 -> R.drawable.ic_sleep_5
else -> R.drawable.ic_sleep_active
})
}- আপনার অ্যাপ চালান। আপনার ডিসপ্লেটি নীচের স্ক্রিনশটের মতো হওয়া উচিত, ঘুমের সময়কাল এবং ঘুমের গুণমানের জন্য পাঠ্য সহ ঘুম-গুণমানের আইকন দেখাচ্ছে।

আপনার RecyclerView এখন সম্পূর্ণ! আপনি শিখেছেন কিভাবে একটি Adapter এবং একটি ViewHolder বাস্তবায়ন করতে হয়, এবং আপনি একটি RecyclerView Adapter সাথে একটি তালিকা প্রদর্শন করতে সেগুলিকে একত্রিত করেছেন৷
আপনার কোড এখন পর্যন্ত একটি অ্যাডাপ্টার এবং ভিউ হোল্ডার তৈরির প্রক্রিয়া দেখায়। যাইহোক, আপনি এই কোড উন্নত করতে পারেন. প্রদর্শনের কোড এবং ভিউ হোল্ডার পরিচালনা করার কোড মিশ্রিত করা হয়েছে, এবং onBindViewHolder() কিভাবে ViewHolder আপডেট করতে হয় সে সম্পর্কে বিশদ জানে।
একটি প্রোডাকশন অ্যাপে, আপনার একাধিক ভিউ হোল্ডার, আরও জটিল অ্যাডাপ্টার এবং একাধিক ডেভেলপার পরিবর্তন করতে পারে। আপনার কোডটি এমনভাবে গঠন করা উচিত যাতে ভিউ হোল্ডারের সাথে সম্পর্কিত সবকিছু শুধুমাত্র ভিউ হোল্ডারে থাকে।
ধাপ 1: রিফ্যাক্টর onBindViewHolder()
এই ধাপে, আপনি কোডটি রিফ্যাক্টর করুন এবং সমস্ত ভিউ হোল্ডার কার্যকারিতা ViewHolder সরান। এই রিফ্যাক্টরিংয়ের উদ্দেশ্য ব্যবহারকারীর কাছে অ্যাপটি কীভাবে দেখায় তা পরিবর্তন করা নয়, তবে বিকাশকারীদের কোডে কাজ করা সহজ এবং নিরাপদ করা। সৌভাগ্যবশত, অ্যান্ড্রয়েড স্টুডিওতে সাহায্য করার জন্য টুল রয়েছে।
-
SleepNightAdapterএ,onBindViewHolder()-এ, পরিবর্তনশীলitemঘোষণা করতে বিবৃতি ছাড়া সবকিছু নির্বাচন করুন। - রাইট-ক্লিক করুন, তারপর রিফ্যাক্টর > এক্সট্রাক্ট > ফাংশন নির্বাচন করুন।
- ফাংশন
bindনাম দিন এবং প্রস্তাবিত পরামিতি গ্রহণ করুন। ওকে ক্লিক করুন।
bind()ফাংশনটিonBindViewHolder()নিচে রাখা হয়েছে।
private fun bind(holder: ViewHolder, item: SleepNight) {
val res = holder.itemView.context.resources
holder.sleepLength.text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, res)
holder.quality.text = convertNumericQualityToString(item.sleepQuality, res)
holder.qualityImage.setImageResource(when (item.sleepQuality) {
0 -> R.drawable.ic_sleep_0
1 -> R.drawable.ic_sleep_1
2 -> R.drawable.ic_sleep_2
3 -> R.drawable.ic_sleep_3
4 -> R.drawable.ic_sleep_4
5 -> R.drawable.ic_sleep_5
else -> R.drawable.ic_sleep_active
})
}-
bind()এরholderপ্যারামিটারেরholderশব্দে কার্সার রাখুন। অভিপ্রায় মেনু খুলতেAlt+Enter( একটি Mac-এOption+Enter) টিপুন। এটিকে একটি এক্সটেনশন ফাংশনে রূপান্তর করতে রিসিভারে রূপান্তর পরামিতি নির্বাচন করুন যাতে নিম্নলিখিত স্বাক্ষর রয়েছে:
private fun ViewHolder.bind(item: SleepNight) {...}-
ViewHolderএbind()ফাংশনটি কাট এবং পেস্ট করুন। -
bind()পাবলিক করুন। - প্রয়োজনে, অ্যাডাপ্টারের মধ্যে
bind()আমদানি করুন। - কারণ এটি এখন
ViewHolderএ রয়েছে, আপনি স্বাক্ষরেরViewHolderঅংশটি সরাতে পারেন। এখানেViewHolderক্লাসেbind()ফাংশনের চূড়ান্ত কোড রয়েছে।
fun bind(item: SleepNight) {
val res = itemView.context.resources
sleepLength.text = convertDurationToFormatted(
item.startTimeMilli, item.endTimeMilli, res)
quality.text = convertNumericQualityToString(
item.sleepQuality, res)
qualityImage.setImageResource(when (item.sleepQuality) {
0 -> R.drawable.ic_sleep_0
1 -> R.drawable.ic_sleep_1
2 -> R.drawable.ic_sleep_2
3 -> R.drawable.ic_sleep_3
4 -> R.drawable.ic_sleep_4
5 -> R.drawable.ic_sleep_5
else -> R.drawable.ic_sleep_active
})
}ধাপ 2: রিফ্যাক্টর onCreateViewHolder
অ্যাডাপ্টারের onCreateViewHolder() পদ্ধতিটি বর্তমানে ViewHolder জন্য লেআউট রিসোর্স থেকে ভিউকে স্ফীত করে। যাইহোক, মুদ্রাস্ফীতির সাথে অ্যাডাপ্টারের কোন সম্পর্ক নেই, এবং সবকিছুই ViewHolder সাথে। মূল্যস্ফীতি ViewHolder হওয়া উচিত।
-
onCreateViewHolder()এ, ফাংশনের মূল অংশে সমস্ত কোড নির্বাচন করুন। - রাইট-ক্লিক করুন, তারপর রিফ্যাক্টর > এক্সট্রাক্ট > ফাংশন নির্বাচন করুন।
-
fromফাংশনটির নাম দিন এবং প্রস্তাবিত পরামিতিগুলি গ্রহণ করুন। ওকে ক্লিক করুন। -
fromফাংশনের নামের উপর কার্সার রাখুন। অভিপ্রায় মেনু খুলতেAlt+Enter( একটি Mac-এOption+Enter) টিপুন। - সঙ্গী বস্তুতে সরান নির্বাচন করুন।
from()ফাংশনটি একটি সহচর অবজেক্টে থাকা দরকার যাতে এটিViewHolderক্লাসে কল করা যায়,ViewHolderইনস্ট্যান্সে বলা হয় না। -
companionবস্তুটিকেViewHolderক্লাসে সরান। -
from()তৈরি করুন। -
onCreateViewHolder()এ,ViewHolderক্লাসেfrom()কল করার ফলাফল ফেরত দিতেreturnস্টেটমেন্ট পরিবর্তন করুন।
আপনার সম্পূর্ণ করাonCreateViewHolder()এবংfrom()পদ্ধতিগুলি নীচের কোডের মতো হওয়া উচিত এবং আপনার কোডটি তৈরি করা উচিত এবং ত্রুটি ছাড়াই চালানো উচিত৷
override fun onCreateViewHolder(parent: ViewGroup, viewType:
Int): ViewHolder {
return ViewHolder.from(parent)
}companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val view = layoutInflater
.inflate(R.layout.list_item_sleep_night, parent, false)
return ViewHolder(view)
}
}-
ViewHolderক্লাসের স্বাক্ষর পরিবর্তন করুন যাতে কনস্ট্রাক্টর ব্যক্তিগত হয়। যেহেতুfrom()এখন একটি পদ্ধতি যা একটি নতুনViewHolderউদাহরণ প্রদান করে, তাই কারও আরViewHolderকনস্ট্রাক্টরকে কল করার কোনও কারণ নেই।
class ViewHolder private constructor(itemView: View) : RecyclerView.ViewHolder(itemView){- অ্যাপটি চালান। আপনার অ্যাপটি আগের মতোই তৈরি এবং চালানো উচিত, যা রিফ্যাক্টরিংয়ের পরে পছন্দসই ফলাফল।
অ্যান্ড্রয়েড স্টুডিও প্রকল্প: RecyclerViewFundamentals
- ডেটার একটি তালিকা বা গ্রিড প্রদর্শন করা অ্যান্ড্রয়েডের সবচেয়ে সাধারণ UI কাজগুলির মধ্যে একটি।
RecyclerViewঅত্যন্ত বড় তালিকা প্রদর্শন করার সময়ও দক্ষ হতে ডিজাইন করা হয়েছে। -
RecyclerViewশুধুমাত্র স্ক্রিনে দৃশ্যমান আইটেমগুলি প্রক্রিয়া বা আঁকার জন্য প্রয়োজনীয় কাজ করে। - যখন একটি আইটেম পর্দা বন্ধ স্ক্রোল, তার দৃশ্য পুনর্ব্যবহৃত হয়. এর মানে আইটেমটি নতুন সামগ্রী দিয়ে পূর্ণ যা স্ক্রিনে স্ক্রোল করে।
- সফ্টওয়্যার ইঞ্জিনিয়ারিং-এ অ্যাডাপ্টার প্যাটার্ন একটি বস্তুকে অন্য API এর সাথে একসাথে কাজ করতে সহায়তা করে।
RecyclerViewঅ্যাপ ডেটাকে এমন কিছুতে রূপান্তর করতে একটি অ্যাডাপ্টার ব্যবহার করে যা এটি প্রদর্শন করতে পারে, অ্যাপ কীভাবে ডেটা সঞ্চয় করে এবং প্রক্রিয়া করে তা পরিবর্তন করার প্রয়োজন ছাড়াই।
একটি RecyclerView এ আপনার ডেটা প্রদর্শন করতে, আপনার নিম্নলিখিত অংশগুলির প্রয়োজন:
- রিসাইক্লারভিউ
RecyclerViewএর একটি উদাহরণ তৈরি করতে, লেআউট ফাইলে একটি<RecyclerView>উপাদান সংজ্ঞায়িত করুন। - লেআউট ম্যানেজার
একটিRecyclerViewRecyclerViewএ আইটেমগুলির বিন্যাস সংগঠিত করার জন্য একটিLayoutManagerব্যবহার করে, যেমন একটি গ্রিডে বা একটি রৈখিক তালিকায় রাখা।
লেআউট ফাইলের<RecyclerView>-এ, লেআউট ম্যানেজারের (যেমনLinearLayoutManagerবাGridLayoutManager)app:layoutManagerঅ্যাট্রিবিউট সেট করুন।
আপনি প্রোগ্রামগতভাবে একটিRecyclerViewএর জন্যLayoutManagerসেট করতে পারেন। (এই কৌশলটি পরবর্তী কোডল্যাবে কভার করা হয়েছে।) - প্রতিটি আইটেমের জন্য বিন্যাস
একটি XML লেআউট ফাইলে ডেটার একটি আইটেমের জন্য একটি লেআউট তৈরি করুন। - অ্যাডাপ্টার
একটি অ্যাডাপ্টার তৈরি করুন যা ডেটা প্রস্তুত করে এবং কীভাবে এটি একটিViewHolderপ্রদর্শিত হবে।RecyclerViewএর সাথে অ্যাডাপ্টারটিকে সংযুক্ত করুন।
যখনRecyclerViewচলে, তখন এটি অ্যাডাপ্টার ব্যবহার করে স্ক্রীনে ডেটা কীভাবে প্রদর্শন করা যায় তা বের করবে।
অ্যাডাপ্টারের জন্য আপনাকে নিম্নলিখিত পদ্ধতিগুলি প্রয়োগ করতে হবে:
-getItemCount()আইটেমের সংখ্যা ফেরত দিতে।
–onCreateViewHolder()তালিকার একটি আইটেমের জন্যViewHolderফেরত দিতে।
–onBindViewHolder()তালিকার একটি আইটেমের ভিউতে ডেটা মানিয়ে নিতে। - ভিউহোল্ডার
একটিViewHolderআইটেমের লেআউট থেকে একটি আইটেম প্রদর্শনের জন্য ভিউ তথ্য ধারণ করে। - অ্যাডাপ্টারের
onBindViewHolder()পদ্ধতিটি ভিউতে ডেটা অ্যাডাপ্ট করে। আপনি সবসময় এই পদ্ধতি ওভাররাইড. সাধারণত,onBindViewHolder()একটি আইটেমের লেআউটকে স্ফীত করে এবং লেআউটের ভিউতে ডেটা রাখে। - যেহেতু
RecyclerViewডেটা সম্পর্কে কিছুই জানে না, সেই ডেটা পরিবর্তন হলেAdapterRecyclerViewজানাতে হবে।Adapterঅবহিত করতেnotifyDataSetChanged()ব্যবহার করুন যে ডেটা পরিবর্তিত হয়েছে।
উদাসীনতা কোর্স:
অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:
এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:
- প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
- শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
- হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.
প্রশিক্ষকরা এই পরামর্শগুলি যতটা কম বা যতটা চান ততটা ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।
আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলিকে নির্দ্বিধায় ব্যবহার করুন৷
এই প্রশ্নগুলোর উত্তর দাও
প্রশ্ন 1
কিভাবে RecyclerView আইটেম প্রদর্শন করে? প্রযোজ্য সব নির্বাচন করুন.
▢ একটি তালিকা বা একটি গ্রিডে আইটেম প্রদর্শন করে।
▢ উল্লম্বভাবে বা অনুভূমিকভাবে স্ক্রোল করে।
▢ ট্যাবলেটের মতো বড় ডিভাইসে তির্যকভাবে স্ক্রোল করুন।
▢ একটি তালিকা বা গ্রিড ব্যবহারের ক্ষেত্রে যথেষ্ট না হলে কাস্টম লেআউটের অনুমতি দেয়।
প্রশ্ন 2
RecyclerView ব্যবহার করার সুবিধা কি কি? প্রযোজ্য সব নির্বাচন করুন.
▢ দক্ষতার সাথে বড় তালিকা প্রদর্শন করে।
▢ স্বয়ংক্রিয়ভাবে ডেটা আপডেট করে।
▢ একটি আইটেম আপডেট করা, মুছে ফেলা বা তালিকায় যোগ করা হলে রিফ্রেশের প্রয়োজন কমিয়ে দেয়।
▢ স্ক্রীনে স্ক্রোল করা পরবর্তী আইটেমটি প্রদর্শন করতে স্ক্রীন বন্ধ করে দেওয়া ভিউ পুনরায় ব্যবহার করে।
প্রশ্ন 3
অ্যাডাপ্টার ব্যবহার করার জন্য কিছু কারণ কি? প্রযোজ্য সব নির্বাচন করুন.
▢ উদ্বেগের বিচ্ছেদ কোড পরিবর্তন এবং পরীক্ষা করা সহজ করে তোলে।
▢ RecyclerView যে ডেটা প্রদর্শিত হচ্ছে তার জন্য অজ্ঞেয়বাদী।
▢ ডেটা প্রসেসিং স্তরগুলিকে কীভাবে ডেটা প্রদর্শিত হবে তা নিয়ে নিজেদের উদ্বিগ্ন হওয়ার দরকার নেই৷
▢ অ্যাপটি দ্রুত চলবে।
প্রশ্ন 4
নিচের কোনটি ViewHolder ক্ষেত্রে সত্য? প্রযোজ্য সব নির্বাচন করুন.
▢ ViewHolder লেআউট XML লেআউট ফাইলগুলিতে সংজ্ঞায়িত করা হয়েছে।
▢ ডেটাসেটে ডেটার প্রতিটি ইউনিটের জন্য একটি ViewHolder রয়েছে৷
▢ একটি RecyclerView এ আপনার একাধিক ViewHolder থাকতে পারে।
▢ Adapter ViewHolder সাথে ডেটা আবদ্ধ করে।
পরবর্তী পাঠ শুরু করুন: