এই কোডল্যাবটি অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোর্সের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।
ভূমিকা
এই কোডল্যাব আপনাকে আইটেমগুলির তালিকা প্রদর্শন করার জন্য একটি 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
টেনে আনুন।RecyclerView
ConstraintLayout
ভিতরে রাখুন।
- আপনি একটি নির্ভরতা যোগ করতে চান কিনা তা জিজ্ঞাসা করে যদি একটি ডায়ালগ খোলে, তাহলে অ্যান্ড্রয়েড স্টুডিওকে আপনার গ্রেডল ফাইলে
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" />
-
RecyclerView
sleep_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"
-
RecyclerView
XML-এ একটি লেআউট ম্যানেজার যোগ করুন। প্রতিটি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]
- আপনার তৈরি করা
ViewHolder
textView
নামে একটি সম্পত্তি রয়েছে।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 TextView
onCreateViewHolder()
এ,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
সংজ্ঞা ব্যতীত সমস্ত কোড মুছুন। - একটি
val
res
সংজ্ঞায়িত করুন যা এই দৃশ্যের জন্য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>
উপাদান সংজ্ঞায়িত করুন। - লেআউট ম্যানেজার
একটিRecyclerView
RecyclerView
এ আইটেমগুলির বিন্যাস সংগঠিত করার জন্য একটিLayoutManager
ব্যবহার করে, যেমন একটি গ্রিডে বা একটি রৈখিক তালিকায় রাখা।
লেআউট ফাইলের<RecyclerView>
-এ, লেআউট ম্যানেজারের (যেমনLinearLayoutManager
বাGridLayoutManager
)app:layoutManager
অ্যাট্রিবিউট সেট করুন।
আপনি প্রোগ্রামগতভাবে একটিRecyclerView
এর জন্যLayoutManager
সেট করতে পারেন। (এই কৌশলটি পরবর্তী কোডল্যাবে কভার করা হয়েছে।) - প্রতিটি আইটেমের জন্য বিন্যাস
একটি XML লেআউট ফাইলে ডেটার একটি আইটেমের জন্য একটি লেআউট তৈরি করুন। - অ্যাডাপ্টার
একটি অ্যাডাপ্টার তৈরি করুন যা ডেটা প্রস্তুত করে এবং কীভাবে এটি একটিViewHolder
প্রদর্শিত হবে।RecyclerView
এর সাথে অ্যাডাপ্টারটিকে সংযুক্ত করুন।
যখনRecyclerView
চলে, তখন এটি অ্যাডাপ্টার ব্যবহার করে স্ক্রীনে ডেটা কীভাবে প্রদর্শন করা যায় তা বের করবে।
অ্যাডাপ্টারের জন্য আপনাকে নিম্নলিখিত পদ্ধতিগুলি প্রয়োগ করতে হবে:
-getItemCount()
আইটেমের সংখ্যা ফেরত দিতে।
–onCreateViewHolder()
তালিকার একটি আইটেমের জন্যViewHolder
ফেরত দিতে।
–onBindViewHolder()
তালিকার একটি আইটেমের ভিউতে ডেটা মানিয়ে নিতে। - ভিউহোল্ডার
একটিViewHolder
আইটেমের লেআউট থেকে একটি আইটেম প্রদর্শনের জন্য ভিউ তথ্য ধারণ করে। - অ্যাডাপ্টারের
onBindViewHolder()
পদ্ধতিটি ভিউতে ডেটা অ্যাডাপ্ট করে। আপনি সবসময় এই পদ্ধতি ওভাররাইড. সাধারণত,onBindViewHolder()
একটি আইটেমের লেআউটকে স্ফীত করে এবং লেআউটের ভিউতে ডেটা রাখে। - যেহেতু
RecyclerView
ডেটা সম্পর্কে কিছুই জানে না, সেই ডেটা পরিবর্তন হলেAdapter
RecyclerView
জানাতে হবে।Adapter
অবহিত করতেnotifyDataSetChanged()
ব্যবহার করুন যে ডেটা পরিবর্তিত হয়েছে।
উদাসীনতা কোর্স:
অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:
এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:
- প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
- শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
- হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.
প্রশিক্ষকরা এই পরামর্শগুলি যতটা কম বা যতটা চান ততটা ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।
আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলিকে নির্দ্বিধায় ব্যবহার করুন৷
এই প্রশ্নগুলোর উত্তর দাও
প্রশ্ন 1
কিভাবে RecyclerView
আইটেম প্রদর্শন করে? প্রযোজ্য সব নির্বাচন করুন.
▢ একটি তালিকা বা একটি গ্রিডে আইটেম প্রদর্শন করে।
▢ উল্লম্বভাবে বা অনুভূমিকভাবে স্ক্রোল করে।
▢ ট্যাবলেটের মতো বড় ডিভাইসে তির্যকভাবে স্ক্রোল করুন।
▢ একটি তালিকা বা গ্রিড ব্যবহারের ক্ষেত্রে যথেষ্ট না হলে কাস্টম লেআউটের অনুমতি দেয়।
প্রশ্ন 2
RecyclerView
ব্যবহার করার সুবিধা কি কি? প্রযোজ্য সব নির্বাচন করুন.
▢ দক্ষতার সাথে বড় তালিকা প্রদর্শন করে।
▢ স্বয়ংক্রিয়ভাবে ডেটা আপডেট করে।
▢ একটি আইটেম আপডেট করা, মুছে ফেলা বা তালিকায় যোগ করা হলে রিফ্রেশের প্রয়োজন কমিয়ে দেয়।
▢ স্ক্রীনে স্ক্রোল করা পরবর্তী আইটেমটি প্রদর্শন করতে স্ক্রীন বন্ধ করে দেওয়া ভিউ পুনরায় ব্যবহার করে।
প্রশ্ন 3
অ্যাডাপ্টার ব্যবহার করার জন্য কিছু কারণ কি? প্রযোজ্য সব নির্বাচন করুন.
▢ উদ্বেগের বিচ্ছেদ কোড পরিবর্তন এবং পরীক্ষা করা সহজ করে তোলে।
▢ RecyclerView
যে ডেটা প্রদর্শিত হচ্ছে তার জন্য অজ্ঞেয়বাদী।
▢ ডেটা প্রসেসিং স্তরগুলিকে কীভাবে ডেটা প্রদর্শিত হবে তা নিয়ে নিজেদের উদ্বিগ্ন হওয়ার দরকার নেই৷
▢ অ্যাপটি দ্রুত চলবে।
প্রশ্ন 4
নিচের কোনটি ViewHolder
ক্ষেত্রে সত্য? প্রযোজ্য সব নির্বাচন করুন.
▢ ViewHolder
লেআউট XML লেআউট ফাইলগুলিতে সংজ্ঞায়িত করা হয়েছে।
▢ ডেটাসেটে ডেটার প্রতিটি ইউনিটের জন্য একটি ViewHolder
রয়েছে৷
▢ একটি RecyclerView
এ আপনার একাধিক ViewHolder
থাকতে পারে।
▢ Adapter
ViewHolder
সাথে ডেটা আবদ্ধ করে।
পরবর্তী পাঠ শুরু করুন: