অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টালস 07.1: রিসাইক্লারভিউ ফান্ডামেন্টালস

এই কোডল্যাবটি অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোর্সের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।

ভূমিকা

এই কোডল্যাব আপনাকে আইটেমগুলির তালিকা প্রদর্শন করার জন্য একটি 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 প্রতিস্থাপন করুন।

  1. GitHub থেকে RecyclerViewFundamentals-Starter অ্যাপ ডাউনলোড করুন।
  2. অ্যাপটি তৈরি করুন এবং চালান। লক্ষ্য করুন কিভাবে ডেটা সহজ পাঠ্য হিসাবে প্রদর্শিত হয়।
  3. Android স্টুডিওতে ডিজাইন ট্যাবে fragment_sleep_tracker.xml লেআউট ফাইলটি খুলুন।
  4. কম্পোনেন্ট ট্রি প্যানে, ScrollView মুছুন। এই ক্রিয়াটি ScrollView এর ভিতরে থাকা TextView টিকেও মুছে দেয়।
  5. প্যালেট প্যানে, কন্টেনারগুলি খুঁজে পেতে বাম দিকে উপাদান প্রকারের তালিকার মাধ্যমে স্ক্রোল করুন, তারপর এটি নির্বাচন করুন।
  6. প্যালেট ফলক থেকে কম্পোনেন্ট ট্রি প্যানে একটি RecyclerView টেনে আনুন। RecyclerView ConstraintLayout ভিতরে রাখুন।

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

  1. মডিউল build.gradle ফাইলটি খুলুন, শেষ পর্যন্ত স্ক্রোল করুন, এবং নতুন নির্ভরতা নোট করুন, যা নীচের কোডের মতো দেখাচ্ছে:
implementation 'androidx.recyclerview:recyclerview:1.0.0'
  1. fragment_sleep_tracker.xml এ ফিরে যান।
  2. পাঠ্য ট্যাবে, নীচে দেখানো RecyclerView কোডটি সন্ধান করুন:
<androidx.recyclerview.widget.RecyclerView
   android:layout_width="match_parent"
   android:layout_height="match_parent" />
  1. RecyclerView sleep_list এর একটি id দিন।
android:id="@+id/sleep_list"
  1. 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"
  1. RecyclerView XML-এ একটি লেআউট ম্যানেজার যোগ করুন। প্রতিটি RecyclerView একটি লেআউট ম্যানেজার প্রয়োজন যা এটিকে বলে যে কীভাবে তালিকায় আইটেমগুলিকে অবস্থান করতে হয়। Android একটি LinearLayoutManager প্রদান করে, যা ডিফল্টরূপে আইটেমগুলিকে সম্পূর্ণ প্রস্থের সারির একটি উল্লম্ব তালিকায় রাখে।
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
  1. ডিজাইন ট্যাবে স্যুইচ করুন এবং লক্ষ্য করুন যে অতিরিক্ত সীমাবদ্ধতার কারণে RecyclerView উপলব্ধ স্থান পূরণ করতে প্রসারিত হয়েছে।

ধাপ 2: তালিকা আইটেম লেআউট এবং টেক্সট ভিউ হোল্ডার তৈরি করুন

RecyclerView শুধুমাত্র একটি ধারক। এই ধাপে, আপনি RecyclerView ভিতরে প্রদর্শিত আইটেমগুলির জন্য বিন্যাস এবং অবকাঠামো তৈরি করেন।

যত তাড়াতাড়ি সম্ভব একটি কার্যকরী RecyclerView যাওয়ার জন্য, প্রথমে আপনি একটি সরল তালিকা আইটেম ব্যবহার করুন যা শুধুমাত্র একটি সংখ্যা হিসাবে ঘুমের গুণমান প্রদর্শন করে। এর জন্য, আপনার একটি ভিউ হোল্ডার প্রয়োজন, TextItemViewHolder । ডেটার জন্য আপনার একটি ভিউ, একটি TextView প্রয়োজন। (পরবর্তী ধাপে, আপনি ভিউ হোল্ডার এবং সমস্ত ঘুমের ডেটা কীভাবে সাজাতে হয় সে সম্পর্কে আরও শিখবেন।)

  1. text_item_view.xml নামে একটি লেআউট ফাইল তৈরি করুন। আপনি রুট উপাদান হিসাবে কি ব্যবহার করেন তা কোন ব্যাপার না, কারণ আপনি টেমপ্লেট কোড প্রতিস্থাপন করবেন।
  2. text_item_view.xml এ, প্রদত্ত সমস্ত কোড মুছে দিন।
  3. শুরুতে এবং শেষে 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" />
  1. Util.kt খুলুন। শেষ পর্যন্ত স্ক্রোল করুন এবং নীচে দেখানো সংজ্ঞা যোগ করুন, যা TextItemViewHolder ক্লাস তৈরি করে। শেষ ক্লোজিং ব্রেসের পরে, ফাইলের নীচে কোডটি রাখুন। কোডটি Util.kt এ যায় কারণ এই ভিউ হোল্ডারটি অস্থায়ী, এবং আপনি পরে এটি প্রতিস্থাপন করবেন।
class TextItemViewHolder(val textView: TextView): RecyclerView.ViewHolder(textView)
  1. আপনাকে অনুরোধ করা হলে, android.widget.TextView এবং androidx.recyclerview.widget.RecyclerView আমদানি করুন।

ধাপ 3: SleepNightAdapter তৈরি করুন

একটি RecyclerView বাস্তবায়নের মূল কাজটি অ্যাডাপ্টার তৈরি করা। আইটেম দেখার জন্য আপনার কাছে একটি সাধারণ ভিউ ধারক এবং প্রতিটি আইটেমের জন্য একটি বিন্যাস রয়েছে। আপনি এখন একটি অ্যাডাপ্টার তৈরি করতে পারেন। অ্যাডাপ্টার একটি ভিউ হোল্ডার তৈরি করে এবং RecyclerView প্রদর্শনের জন্য ডেটা দিয়ে এটি পূরণ করে।

  1. sleeptracker প্যাকেজে, SleepNightAdapter নামে একটি নতুন Kotlin ক্লাস তৈরি করুন।
  2. SleepNightAdapter ক্লাস প্রসারিত করুন RecyclerView.Adapter . ক্লাসটিকে SleepNightAdapter বলা হয় কারণ এটি একটি SleepNight অবজেক্টকে এমন কিছুতে অভিযোজিত করে যা RecyclerView ব্যবহার করতে পারে। কোন ভিউ হোল্ডার ব্যবহার করতে হবে তা অ্যাডাপ্টারের জানতে হবে, তাই TextItemViewHolder এ পাস করুন। অনুরোধ করা হলে প্রয়োজনীয় উপাদানগুলি আমদানি করুন এবং তারপরে আপনি একটি ত্রুটি দেখতে পাবেন, কারণ বাস্তবায়নের জন্য বাধ্যতামূলক পদ্ধতি রয়েছে।
class SleepNightAdapter: RecyclerView.Adapter<TextItemViewHolder>() {}
  1. SleepNightAdapter এর শীর্ষ স্তরে, ডেটা ধরে রাখতে SleepNight ভেরিয়েবলের একটি listOf তৈরি করুন।
var data =  listOf<SleepNight>()
  1. SleepNightAdapter এ, getItemCount() ওভাররাইড করে data ঘুমের রাতের তালিকার আকার ফেরত দিন। RecyclerView জানতে হবে অ্যাডাপ্টারের কতগুলি আইটেম দেখানোর জন্য, এবং এটি getItemCount() কল করে তা করে।
override fun getItemCount() = data.size
  1. SleepNightAdapter এ, onBindViewHolder() ফাংশনটি ওভাররাইড করুন, যেমনটি নীচে দেখানো হয়েছে।

    onBindViewHolder() ফাংশনটিকে RecyclerView দ্বারা বলা হয় নির্দিষ্ট অবস্থানে একটি তালিকা আইটেমের জন্য ডেটা প্রদর্শন করতে। তাই onBindViewHolder() পদ্ধতিতে দুটি আর্গুমেন্ট লাগে: একটি ভিউ হোল্ডার, এবং ডাটার একটি পজিশন আবদ্ধ করার জন্য। এই অ্যাপের জন্য, ধারক হল TextItemViewHolder , এবং পজিশন হল তালিকার অবস্থান৷
override fun onBindViewHolder(holder: TextItemViewHolder, position: Int) {
}
  1. onBindViewHolder() ভিতরে, ডেটাতে একটি নির্দিষ্ট অবস্থানে একটি আইটেমের জন্য একটি ভেরিয়েবল তৈরি করুন।
 val item = data[position]
  1. আপনার তৈরি করা ViewHolder textView নামে একটি সম্পত্তি রয়েছে। onBindViewHolder() এর ভিতরে, textView -এর text ঘুম-গুণমানের নম্বরে সেট করুন। এই কোডটি শুধুমাত্র সংখ্যার একটি তালিকা প্রদর্শন করে, কিন্তু এই সাধারণ উদাহরণটি আপনাকে দেখতে দেয় কিভাবে অ্যাডাপ্টার ভিউ হোল্ডার এবং স্ক্রিনে ডেটা পায়।
holder.textView.text = item.sleepQuality.toString()
  1. SleepNightAdapter এ, onCreateViewHolder() ওভাররাইড করুন এবং প্রয়োগ করুন, যেটিকে বলা হয় যখন RecyclerView একটি আইটেম উপস্থাপন করার জন্য একটি ভিউ হোল্ডারের প্রয়োজন হয়।

    এই ফাংশনটি দুটি প্যারামিটার নেয় এবং একটি ViewHolder প্রদান করে। parent প্যারামিটার, যা ভিউ গোষ্ঠী যা ভিউ হোল্ডারকে ধরে রাখে, সর্বদা RecyclerView হয়। একই RecyclerView এ একাধিক ভিউ থাকলে viewType প্যারামিটার ব্যবহার করা হয়। উদাহরণস্বরূপ, আপনি যদি একই RecyclerView এ টেক্সট ভিউ, একটি ছবি এবং একটি ভিডিওর একটি তালিকা রাখেন, তাহলে onCreateViewHolder() ফাংশনটি জানতে হবে কোন ধরনের ভিউ ব্যবহার করতে হবে।
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextItemViewHolder {
}
  1. onCreateViewHolder() এ, LayoutInflater এর একটি উদাহরণ তৈরি করুন।

    লেআউট ইনফ্লাটার জানে কিভাবে XML লেআউট থেকে ভিউ তৈরি করতে হয়। context তথ্য রয়েছে কিভাবে সঠিকভাবে ভিউকে স্ফীত করা যায়। একটি রিসাইক্লার ভিউয়ের জন্য অ্যাডাপ্টারে, আপনি সবসময় parent ভিউ গ্রুপের প্রেক্ষাপটে পাস করেন, যা হল RecyclerView
val layoutInflater = LayoutInflater.from(parent.context)
  1. onCreateViewHolder() -এ, layoutinflater স্ফীত করতে বলে view তৈরি করুন।

    ভিউয়ের জন্য XML লেআউট এবং ভিউয়ের জন্য parent ভিউ গ্রুপ পাস করুন। তৃতীয়, বুলিয়ান, আর্গুমেন্ট হল attachToRoot । এই যুক্তিটি false হওয়া দরকার, কারণ RecyclerView এই আইটেমটিকে আপনার জন্য ভিউ হায়ারার্কিতে যোগ করে যখন এটি সময় হয়৷
val view = layoutInflater
       .inflate(R.layout.text_item_view, parent, false) as TextView
  1. onCreateViewHolder() এ, view দিয়ে তৈরি একটি TextItemViewHolder ফেরত দিন।
return TextItemViewHolder(view)
  1. অ্যাডাপ্টারটিকে RecyclerView জানাতে হবে যখন data পরিবর্তিত হয়েছে, কারণ RecyclerView ডেটা সম্পর্কে কিছুই জানে না। এটি শুধুমাত্র ভিউ হোল্ডার সম্পর্কে জানে যা অ্যাডাপ্টার এটিকে দেয়।

    RecyclerView জানাতে যখন এটি প্রদর্শিত ডেটা পরিবর্তিত হয়েছে, SleepNightAdapter ক্লাসের শীর্ষে থাকা data ভেরিয়েবলে একটি কাস্টম সেটার যুক্ত করুন৷ সেটারে, data একটি নতুন মান দিন, তারপরে কল করুন notifyDataSetChanged() যাতে নতুন ডেটা দিয়ে তালিকাটি পুনরায় অঙ্কন করা যায়৷
var data =  listOf<SleepNight>()
   set(value) {
       field = value
       notifyDataSetChanged()
   }

ধাপ 4: অ্যাডাপ্টার সম্পর্কে রিসাইক্লারভিউকে বলুন

RecyclerView ভিউ হোল্ডার পেতে অ্যাডাপ্টার সম্পর্কে জানতে হবে।

  1. SleepTrackerFragment.kt খুলুন।
  2. onCreateview() এ, একটি অ্যাডাপ্টার তৈরি করুন। ViewModel মডেল তৈরির পরে এবং return স্টেটমেন্টের আগে এই কোডটি রাখুন।
val adapter = SleepNightAdapter()
  1. RecyclerView এর সাথে adapter সংযুক্ত করুন।
binding.sleepList.adapter = adapter
  1. binding অবজেক্ট আপডেট করতে আপনার প্রোজেক্টটি পরিষ্কার এবং পুনর্নির্মাণ করুন।

    আপনি যদি এখনও binding.sleepList বা binding.FragmentSleepTrackerBinding এর চারপাশে ত্রুটি দেখতে পান, ক্যাশে বাতিল করুন এবং পুনরায় চালু করুন। ( ফাইল নির্বাচন করুন > ক্যাশে বাতিল করুন / পুনরায় চালু করুন ।)

    আপনি যদি এখন অ্যাপটি চালান, কোন ত্রুটি নেই, কিন্তু আপনি স্টার্ট , তারপর থামুন- এ আলতো চাপলে কোনো ডেটা প্রদর্শিত হবে না।

ধাপ 5: অ্যাডাপ্টারে ডেটা পান

এখন পর্যন্ত আপনার কাছে একটি অ্যাডাপ্টার রয়েছে এবং অ্যাডাপ্টার থেকে RecyclerView এ ডেটা পাওয়ার একটি উপায় রয়েছে। এখন আপনাকে ViewModel থেকে অ্যাডাপ্টারে ডেটা পেতে হবে।

  1. SleepTrackerViewModel খুলুন।
  2. nights পরিবর্তনশীল খুঁজুন, যা সমস্ত ঘুমের রাত সঞ্চয় করে, যা প্রদর্শন করার জন্য ডেটা। ডাটাবেসে getAllNights() কল করে nights পরিবর্তনশীল সেট করা হয়।
  3. nights থেকে private সরান, কারণ আপনি একটি পর্যবেক্ষক তৈরি করবেন যা এই পরিবর্তনশীলটি অ্যাক্সেস করতে হবে। আপনার ঘোষণা এই মত হওয়া উচিত:
val nights = database.getAllNights()
  1. database প্যাকেজে, SleepDatabaseDao খুলুন।
  2. getAllNights() ফাংশন খুঁজুন। লক্ষ্য করুন যে এই ফাংশনটি LiveData হিসাবে SleepNight মানগুলির একটি তালিকা প্রদান করে। এর মানে হল যে nights ভেরিয়েবলে LiveData রয়েছে যা Room দ্বারা আপডেট করা হয় এবং কখন এটি পরিবর্তন হয় তা জানতে আপনি nights পর্যবেক্ষণ করতে পারেন।
  3. SleepTrackerFragment খুলুন।
  4. onCreateView() এ, adapter তৈরির নীচে, nights ভেরিয়েবলে একটি পর্যবেক্ষক তৈরি করুন।

    লাইফসাইকেলের মালিক হিসাবে ফ্র্যাগমেন্টের viewLifecycleOwner সরবরাহ করে, আপনি নিশ্চিত করতে পারেন যে এই পর্যবেক্ষকটি শুধুমাত্র সক্রিয় থাকে যখন RecyclerView স্ক্রিনে থাকে।
sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
   })
  1. পর্যবেক্ষকের ভিতরে, যখনই আপনি একটি নন-নাল মান পাবেন ( nights জন্য), অ্যাডাপ্টারের data মান নির্ধারণ করুন। এটি পর্যবেক্ষক এবং ডেটা সেট করার জন্য সম্পূর্ণ কোড:
sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
   it?.let {
       adapter.data = it
   }
})
  1. আপনার কোড তৈরি করুন এবং চালান।

    আপনার অ্যাডাপ্টার কাজ করলে আপনি একটি তালিকা হিসাবে ঘুমের মানের সংখ্যা দেখতে পাবেন। আপনি স্টার্ট ট্যাপ করার পরে বাম দিকের স্ক্রিনশটটি -1 দেখায়। আপনি থামুন আলতো চাপার পরে এবং একটি গুণমানের রেটিং নির্বাচন করার পরে ডানদিকের স্ক্রিনশটটি আপডেট করা ঘুম-গুণমানের নম্বর দেখায়।

ধাপ 6: কিভাবে ভিউ হোল্ডার পুনর্ব্যবহৃত হয় তা অন্বেষণ করুন

RecyclerView ভিউ হোল্ডারকে রিসাইকেল করে , যার মানে এটি তাদের পুনরায় ব্যবহার করে। একটি ভিউ স্ক্রীন থেকে স্ক্রোল করার সাথে সাথে, RecyclerView সেই ভিউটির জন্য পুনরায় ব্যবহার করে যা স্ক্রিনে স্ক্রোল করতে চলেছে।

যেহেতু এই ভিউ হোল্ডারগুলি রিসাইকেল করা হয়েছে, নিশ্চিত করুন onBindViewHolder() সেট বা রিসেট করে এমন কোনো কাস্টমাইজেশন যা পূর্ববর্তী আইটেমগুলি ভিউ হোল্ডারে সেট করতে পারে।

উদাহরণ স্বরূপ, আপনি টেক্সট কালার লাল করে সেট করতে পারেন ভিউ হোল্ডার যেগুলোর কোয়ালিটি রেটিং 1-এর কম বা সমান এবং খারাপ ঘুমের প্রতিনিধিত্ব করে।

  1. SleepNightAdapter ক্লাসে, onBindViewHolder() এর শেষে নিম্নলিখিত কোডটি যোগ করুন।
if (item.sleepQuality <= 1) {
   holder.textView.setTextColor(Color.RED) // red
}
  1. অ্যাপটি চালান।
  2. কিছু কম ঘুমের মানের ডেটা যোগ করুন এবং নম্বরটি লাল।
  3. যতক্ষণ না আপনি স্ক্রিনে একটি লাল উচ্চ সংখ্যা দেখতে পাচ্ছেন ততক্ষণ ঘুমের মানের জন্য উচ্চ রেটিং যোগ করুন।

    যেহেতু RecyclerView ভিউ হোল্ডারদের পুনঃব্যবহার করে, এটি অবশেষে একটি উচ্চ মানের রেটিং এর জন্য লাল ভিউ হোল্ডারগুলির মধ্যে একটিকে পুনরায় ব্যবহার করে। উচ্চ রেটিং ভুলভাবে লাল প্রদর্শিত হয়.

  1. এটি ঠিক করতে, একটি else বিবৃতি যোগ করুন যাতে রঙটি কালোতে সেট করা হয় যদি গুণমানটি একটির চেয়ে কম বা সমান না হয়।

    উভয় শর্ত স্পষ্টভাবে, ভিউ হোল্ডার প্রতিটি আইটেমের জন্য সঠিক পাঠ্য রঙ ব্যবহার করবে।
if (item.sleepQuality <= 1) {
   holder.textView.setTextColor(Color.RED) // red
} else {
   // reset
   holder.textView.setTextColor(Color.BLACK) // black
}
  1. অ্যাপটি চালান, এবং সংখ্যার সবসময় সঠিক রঙ থাকা উচিত।

অভিনন্দন! আপনার কাছে এখন একটি সম্পূর্ণ কার্যকরী মৌলিক 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 কোডটি অনুলিপি করুন এবং পেস্ট করুন৷

  1. একটি নতুন লেআউট রিসোর্স ফাইল তৈরি করুন এবং এটির নাম দিন list_item_sleep_night
  2. নীচের কোড দিয়ে ফাইলের সমস্ত কোড প্রতিস্থাপন করুন। তারপরে আপনি যে লেআউটটি তৈরি করেছেন তার সাথে নিজেকে পরিচিত করুন।
<?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>
  1. অ্যান্ড্রয়েড স্টুডিওতে ডিজাইন ট্যাবে স্যুইচ করুন। ডিজাইন ভিউতে, আপনার লেআউটটি নীচের বাম দিকের স্ক্রিনশটের মতো দেখাচ্ছে৷ ব্লুপ্রিন্ট ভিউতে, এটি ডানদিকের স্ক্রিনশটের মতো দেখায়।

ধাপ 2: ভিউহোল্ডার তৈরি করুন

  1. SleepNightAdapter.kt খুলুন।
  2. ViewHolder নামক SleepNightAdapter ভিতরে একটি ক্লাস করুন এবং এটি RecyclerView.ViewHolder প্রসারিত করুন।
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){}
  1. 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-এ ভিউহোল্ডার ব্যবহার করুন

  1. SleepNightAdapter সংজ্ঞায়, TextItemViewHolder এর পরিবর্তে, আপনি এইমাত্র তৈরি করা SleepNightAdapter.ViewHolder ব্যবহার করুন৷
class SleepNightAdapter: RecyclerView.Adapter<SleepNightAdapter.ViewHolder>() {

আপডেট করুন onCreateViewHolder() :

  1. ViewHolder ফেরত দিতে onCreateViewHolder() এর স্বাক্ষর পরিবর্তন করুন।
  2. সঠিক লেআউট রিসোর্স, list_item_sleep_night ব্যবহার করতে লেআউট ইনফ্লেটার পরিবর্তন করুন
  3. TextView কাস্ট সরান।
  4. একটি 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() উপর আপডেট করুন :

  1. onBindViewHolder() এর স্বাক্ষর পরিবর্তন করুন যাতে holder প্যারামিটারটি TextItemViewHolder এর পরিবর্তে একটি ViewHolder হয়।
  2. onBindViewHolder() এর ভিতরে, item সংজ্ঞা ব্যতীত সমস্ত কোড মুছুন।
  3. একটি val res সংজ্ঞায়িত করুন যা এই দৃশ্যের জন্য resources একটি রেফারেন্স ধারণ করে।
val res = holder.itemView.context.resources
  1. sleepLength টেক্সট ভিউ এর টেক্সট সময়কালের জন্য সেট করুন। নীচের কোডটি অনুলিপি করুন, যা একটি ফর্ম্যাটিং ফাংশনকে কল করে যা স্টার্টার কোডের সাথে সরবরাহ করা হয়েছে।
holder.sleepLength.text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, res)
  1. এটি একটি ত্রুটি দেয়, কারণ convertDurationToFormatted() সংজ্ঞায়িত করা প্রয়োজন। Util.kt খুলুন এবং এর জন্য কোড এবং সংশ্লিষ্ট আমদানিগুলি আনকমেন্ট করুন। ( কোড নির্বাচন করুন > লাইন মন্তব্য সহ মন্তব্য ।)
  2. onBindViewHolder() -এ ফিরে, গুণমান সেট করতে convertNumericQualityToString() ব্যবহার করুন।
holder.quality.text= convertNumericQualityToString(item.sleepQuality, res)
  1. আপনাকে ম্যানুয়ালি এই ফাংশনগুলি আমদানি করতে হতে পারে৷
import com.example.android.trackmysleepquality.convertDurationToFormatted
import com.example.android.trackmysleepquality.convertNumericQualityToString
  1. মানের জন্য সঠিক আইকন সেট করুন। স্টার্টার কোডে আপনার জন্য নতুন 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
})
  1. এখানে 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
        })
    }
  1. আপনার অ্যাপ চালান। আপনার ডিসপ্লেটি নীচের স্ক্রিনশটের মতো হওয়া উচিত, ঘুমের সময়কাল এবং ঘুমের গুণমানের জন্য পাঠ্য সহ ঘুম-গুণমানের আইকন দেখাচ্ছে।

আপনার RecyclerView এখন সম্পূর্ণ! আপনি শিখেছেন কিভাবে একটি Adapter এবং একটি ViewHolder বাস্তবায়ন করতে হয়, এবং আপনি একটি RecyclerView Adapter সাথে একটি তালিকা প্রদর্শন করতে সেগুলিকে একত্রিত করেছেন৷

আপনার কোড এখন পর্যন্ত একটি অ্যাডাপ্টার এবং ভিউ হোল্ডার তৈরির প্রক্রিয়া দেখায়। যাইহোক, আপনি এই কোড উন্নত করতে পারেন. প্রদর্শনের কোড এবং ভিউ হোল্ডার পরিচালনা করার কোড মিশ্রিত করা হয়েছে, এবং onBindViewHolder() কিভাবে ViewHolder আপডেট করতে হয় সে সম্পর্কে বিশদ জানে।

একটি প্রোডাকশন অ্যাপে, আপনার একাধিক ভিউ হোল্ডার, আরও জটিল অ্যাডাপ্টার এবং একাধিক ডেভেলপার পরিবর্তন করতে পারে। আপনার কোডটি এমনভাবে গঠন করা উচিত যাতে ভিউ হোল্ডারের সাথে সম্পর্কিত সবকিছু শুধুমাত্র ভিউ হোল্ডারে থাকে।

ধাপ 1: রিফ্যাক্টর onBindViewHolder()

এই ধাপে, আপনি কোডটি রিফ্যাক্টর করুন এবং সমস্ত ভিউ হোল্ডার কার্যকারিতা ViewHolder সরান। এই রিফ্যাক্টরিংয়ের উদ্দেশ্য ব্যবহারকারীর কাছে অ্যাপটি কীভাবে দেখায় তা পরিবর্তন করা নয়, তবে বিকাশকারীদের কোডে কাজ করা সহজ এবং নিরাপদ করা। সৌভাগ্যবশত, অ্যান্ড্রয়েড স্টুডিওতে সাহায্য করার জন্য টুল রয়েছে।

  1. SleepNightAdapter এ, onBindViewHolder() -এ, পরিবর্তনশীল item ঘোষণা করতে বিবৃতি ছাড়া সবকিছু নির্বাচন করুন।
  2. রাইট-ক্লিক করুন, তারপর রিফ্যাক্টর > এক্সট্রাক্ট > ফাংশন নির্বাচন করুন।
  3. ফাংশন 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
        })
    }
  1. bind() এর holder প্যারামিটারের holder শব্দে কার্সার রাখুন। অভিপ্রায় মেনু খুলতে Alt+Enter ( একটি Mac-এ Option+Enter ) টিপুন। এটিকে একটি এক্সটেনশন ফাংশনে রূপান্তর করতে রিসিভারে রূপান্তর পরামিতি নির্বাচন করুন যাতে নিম্নলিখিত স্বাক্ষর রয়েছে:
private fun ViewHolder.bind(item: SleepNight) {...}
  1. ViewHolderbind() ফাংশনটি কাট এবং পেস্ট করুন।
  2. bind() পাবলিক করুন।
  3. প্রয়োজনে, অ্যাডাপ্টারের মধ্যে bind() আমদানি করুন।
  4. কারণ এটি এখন 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 হওয়া উচিত।

  1. onCreateViewHolder() এ, ফাংশনের মূল অংশে সমস্ত কোড নির্বাচন করুন।
  2. রাইট-ক্লিক করুন, তারপর রিফ্যাক্টর > এক্সট্রাক্ট > ফাংশন নির্বাচন করুন।
  3. from ফাংশনটির নাম দিন এবং প্রস্তাবিত পরামিতিগুলি গ্রহণ করুন। ওকে ক্লিক করুন।
  4. from ফাংশনের নামের উপর কার্সার রাখুন। অভিপ্রায় মেনু খুলতে Alt+Enter ( একটি Mac-এ Option+Enter ) টিপুন।
  5. সঙ্গী বস্তুতে সরান নির্বাচন করুন। from() ফাংশনটি একটি সহচর অবজেক্টে থাকা দরকার যাতে এটি ViewHolder ক্লাসে কল করা যায়, ViewHolder ইনস্ট্যান্সে বলা হয় না।
  6. companion বস্তুটিকে ViewHolder ক্লাসে সরান।
  7. from() তৈরি করুন।
  8. 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)
   }
}
  1. ViewHolder ক্লাসের স্বাক্ষর পরিবর্তন করুন যাতে কনস্ট্রাক্টর ব্যক্তিগত হয়। যেহেতু from() এখন একটি পদ্ধতি যা একটি নতুন ViewHolder উদাহরণ প্রদান করে, তাই কারও আর ViewHolder কনস্ট্রাক্টরকে কল করার কোনও কারণ নেই।
class ViewHolder private constructor(itemView: View) : RecyclerView.ViewHolder(itemView){
  1. অ্যাপটি চালান। আপনার অ্যাপটি আগের মতোই তৈরি এবং চালানো উচিত, যা রিফ্যাক্টরিংয়ের পরে পছন্দসই ফলাফল।

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: 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 সাথে ডেটা আবদ্ধ করে।

পরবর্তী পাঠ শুরু করুন: 7.2: RecyclerView এর সাথে DiffUtil এবং ডেটা বাইন্ডিং