অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টালস 07.4: রিসাইক্লারভিউ আইটেমগুলির সাথে ইন্টারঅ্যাক্ট করা

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

ভূমিকা

আইটেমগুলি প্রদর্শন করে এমন তালিকা এবং গ্রিড ব্যবহার করে এমন বেশিরভাগ অ্যাপ ব্যবহারকারীদের আইটেমগুলির সাথে ইন্টারঅ্যাক্ট করতে দেয়। একটি তালিকা থেকে একটি আইটেম ট্যাপ করা এবং আইটেমের বিশদ বিবরণ দেখা এই ধরনের মিথস্ক্রিয়া জন্য একটি খুব সাধারণ ব্যবহার ক্ষেত্রে. এটি অর্জন করতে, আপনি ক্লিক শ্রোতাদের যোগ করতে পারেন যারা একটি বিশদ দৃশ্য দেখিয়ে আইটেমগুলিতে ব্যবহারকারীর ট্যাপগুলিতে প্রতিক্রিয়া জানায়৷

এই RecyclerView , আপনি আগের কোডল্যাব সিরিজের স্লিপ-ট্র্যাকার অ্যাপের একটি বর্ধিত সংস্করণ তৈরি করে আপনার RecyclerView-এ মিথস্ক্রিয়া যোগ করেন।

আপনি ইতিমধ্যে কি জানা উচিত

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

আপনি কি শিখবেন

  • কিভাবে RecyclerView আইটেমগুলিকে ক্লিক করা যায়। একটি আইটেম ক্লিক করা হলে একটি বিশদ দৃশ্যে নেভিগেট করতে একটি ক্লিক শ্রোতা প্রয়োগ করুন৷

আপনি কি করবেন

  • এই সিরিজের আগের কোডল্যাব থেকে TrackMySleepQuality অ্যাপের একটি বর্ধিত সংস্করণ তৈরি করুন।
  • আপনার তালিকায় একটি ক্লিক শ্রোতা যোগ করুন এবং ব্যবহারকারীর ইন্টারঅ্যাকশনের জন্য শুনতে শুরু করুন। যখন একটি তালিকা আইটেম ট্যাপ করা হয়, এটি ক্লিক করা আইটেমের বিবরণ সহ একটি খণ্ডে নেভিগেশন ট্রিগার করে। স্টার্টার কোড বিশদ খণ্ডের জন্য কোড প্রদান করে, সেইসাথে নেভিগেশন কোডও।

স্টার্টিং স্লিপ-ট্র্যাকার অ্যাপটিতে দুটি স্ক্রীন রয়েছে, যা টুকরো দ্বারা উপস্থাপিত হয়, যেমনটি নীচের চিত্রে দেখানো হয়েছে।

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

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

এই কোডল্যাবে, আপনি প্রতিক্রিয়া করার ক্ষমতা যোগ করেন যখন একজন ব্যবহারকারী গ্রিডে একটি আইটেম ট্যাপ করে, যা নীচের মত একটি বিশদ স্ক্রীন নিয়ে আসে। স্টার্টার অ্যাপের সাথে এই স্ক্রিনের কোড (টুকরো, ভিউ মডেল এবং নেভিগেশন) প্রদান করা হয়েছে এবং আপনি ক্লিক-হ্যান্ডলিং মেকানিজম বাস্তবায়ন করবেন।

ধাপ 1: স্টার্টার অ্যাপ পান

  1. GitHub থেকে RecyclerViewClickHandler-Starter কোডটি ডাউনলোড করুন এবং Android স্টুডিওতে প্রকল্পটি খুলুন।
  2. স্টার্টার স্লিপ-ট্র্যাকার অ্যাপ তৈরি করুন এবং চালান।

[ঐচ্ছিক] আপনি যদি আগের কোডল্যাব থেকে অ্যাপটি ব্যবহার করতে চান তাহলে আপনার অ্যাপ আপডেট করুন

আপনি যদি এই কোডল্যাবের জন্য GitHub-এ দেওয়া স্টার্টার অ্যাপ থেকে কাজ করতে যাচ্ছেন, তাহলে পরবর্তী ধাপে যান।

আপনি যদি আপনার নিজের স্লিপ-ট্র্যাকার অ্যাপটি ব্যবহার করা চালিয়ে যেতে চান যা আপনি পূর্ববর্তী কোডল্যাবে তৈরি করেছেন, তাহলে আপনার বিদ্যমান অ্যাপ আপডেট করতে নীচের নির্দেশাবলী অনুসরণ করুন যাতে এটিতে বিশদ-স্ক্রীন খণ্ডের কোড থাকে।

  1. এমনকি আপনি যদি আপনার বিদ্যমান অ্যাপটি চালিয়ে যাচ্ছেন, GitHub থেকে RecyclerViewClickHandler-Starter কোডটি পান যাতে আপনি ফাইলগুলি অনুলিপি করতে পারেন।
  2. sleepdetail প্যাকেজে সমস্ত ফাইল কপি করুন।
  3. layout ফোল্ডারে, ফাইলটি অনুলিপি করুন fragment_sleep_detail.xml
  4. navigation.xml এর আপডেট করা বিষয়বস্তু কপি করুন, যা sleep_detail_fragment এর জন্য নেভিগেশন যোগ করে।
  5. database প্যাকেজে, SleepDatabaseDao এ, নতুন getNightWithId() পদ্ধতি যোগ করুন:
/**
 * Selects and returns the night with given nightId.
*/
@Query("SELECT * from daily_sleep_quality_table WHERE nightId = :key")
fun getNightWithId(key: Long): LiveData<SleepNight>
  1. res/values/strings এ নিম্নলিখিত স্ট্রিং রিসোর্স যোগ করুন:
<string name="close">Close</string>
  1. ডেটা বাইন্ডিং আপডেট করতে আপনার অ্যাপ পরিষ্কার করুন এবং পুনর্নির্মাণ করুন।

ধাপ 2: ঘুমের বিবরণ স্ক্রিনের জন্য কোডটি পরীক্ষা করুন

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

  1. আপনার অ্যাপে, sleepdetail প্যাকেজ খুঁজুন। এই প্যাকেজটিতে একটি খণ্ডের টুকরো, ভিউ মডেল এবং ভিউ মডেল ফ্যাক্টরি রয়েছে যা এক রাতের ঘুমের বিবরণ প্রদর্শন করে।

  2. sleepdetail প্যাকেজে, SleepDetailViewModel এর কোডটি খুলুন এবং পরিদর্শন করুন। এই ভিউ মডেলটি কনস্ট্রাক্টরে একটি SleepNight এবং একটি DAO-এর চাবিকাঠি নেয়।

    ক্লাসের বডিতে প্রদত্ত কীটির জন্য SleepNight জন্য কোড রয়েছে এবং ক্লোজ বোতাম টিপলে SleepTrackerFragment এ নেভিগেশন নিয়ন্ত্রণ করতে নেভিগেটটো navigateToSleepTracker ভেরিয়েবল রয়েছে।

    getNightWithId() ফাংশন একটি LiveData<SleepNight> করে এবং SleepDatabaseDao ( database প্যাকেজে) সংজ্ঞায়িত করা হয়।

  3. sleepdetail প্যাকেজে, SleepDetailFragment এর কোডটি খুলুন এবং পরিদর্শন করুন। ডেটা বাইন্ডিং, ভিউ মডেল এবং নেভিগেশনের জন্য পর্যবেক্ষকের সেটআপ লক্ষ্য করুন।

  4. sleepdetail প্যাকেজে, SleepDetailViewModelFactory এর কোডটি খুলুন এবং পরিদর্শন করুন।

  5. লেআউট ফোল্ডারে, fragment_sleep_detail.xml পরিদর্শন করুন। ভিউ মডেল থেকে প্রতিটি ভিউতে ডেটা দেখানোর জন্য <data> ট্যাগে সংজ্ঞায়িত sleepDetailViewModel ভেরিয়েবলটি লক্ষ্য করুন।

    লেআউটে একটি ImageView লেআউট রয়েছে যাতে ঘুমের মানের জন্য একটি ConstraintLayout , মানের রেটিং-এর জন্য একটি TextView , ঘুমের দৈর্ঘ্যের জন্য একটি TextView এবং বিশদ খণ্ডটি বন্ধ করার জন্য একটি Button রয়েছে।

  6. navigation.xml ফাইলটি খুলুন। sleep_tracker_fragment এর জন্য, sleep_detail_fragment এর জন্য নতুন ক্রিয়া লক্ষ্য করুন।

    নতুন অ্যাকশন, action_sleep_tracker_fragment_to_sleepDetailFragment হল স্লিপ ট্র্যাকার ফ্র্যাগমেন্ট থেকে বিশদ স্ক্রিনে নেভিগেশন।

এই টাস্কে, আপনি ট্যাপ করা আইটেমের জন্য একটি বিশদ স্ক্রীন দেখিয়ে ব্যবহারকারীর ট্যাপের প্রতিক্রিয়া জানাতে RecyclerView আপডেট করেন।

ক্লিকগুলি গ্রহণ করা এবং সেগুলি পরিচালনা করা একটি দুটি-অংশের কাজ: প্রথমে, আপনাকে ক্লিক শুনতে এবং গ্রহণ করতে হবে এবং কোন আইটেমটি ক্লিক করা হয়েছে তা নির্ধারণ করতে হবে৷ তারপরে, আপনাকে একটি ক্রিয়া সহ ক্লিকে প্রতিক্রিয়া জানাতে হবে।

সুতরাং, এই অ্যাপের জন্য ক্লিক শ্রোতা যোগ করার জন্য সেরা জায়গা কি?

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

যদিও ViewHolder ক্লিকগুলি শোনার জন্য একটি দুর্দান্ত জায়গা, এটি সাধারণত সেগুলি পরিচালনা করার জন্য সঠিক জায়গা নয়৷ সুতরাং, ক্লিকগুলি পরিচালনা করার জন্য সেরা জায়গা কি?

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

ধাপ 1: একটি ক্লিক লিসেনার তৈরি করুন এবং আইটেম লেআউট থেকে এটি ট্রিগার করুন

  1. sleeptracker ফোল্ডারে, SleepNightAdapter.kt খুলুন।
  2. ফাইলের শেষে, শীর্ষ স্তরে, একটি নতুন শ্রোতা শ্রেণি তৈরি করুন, SleepNightListener
class SleepNightListener() {
    
}
  1. SleepNightListener ক্লাসের ভিতরে, একটি onClick() ফাংশন যোগ করুন। যখন একটি তালিকা আইটেম প্রদর্শন করে এমন ভিউটিতে ক্লিক করা হয়, ভিউটি এটিকে onClick() ফাংশন বলে। (আপনি পরে এই ফাংশনে ভিউয়ের android:onClick বৈশিষ্ট্য সেট করবেন।)
class SleepNightListener() {
    fun onClick() = 
}
  1. onClick() SleepNight টাইপের একটি ফাংশন আর্গুমেন্ট night যোগ করুন। ভিউটি জানে যে এটি কোন আইটেমটি প্রদর্শন করছে এবং সেই তথ্যটি ক্লিক পরিচালনা করার জন্য প্রেরণ করা প্রয়োজন।
class SleepNightListener() {
    fun onClick(night: SleepNight) = 
}
  1. onClick() কি করে তা সংজ্ঞায়িত করতে, SleepNightListener এর কনস্ট্রাক্টরে একটি clickListener কলব্যাক প্রদান করুন এবং এটি onClick() এ বরাদ্দ করুন।

    Lambda যেটি ক্লিক পরিচালনা করে একটি নাম দেওয়া, clickListener , এটি ক্লাসের মধ্যে পাস করার সময় ট্র্যাক রাখতে সাহায্য করে। ডাটাবেস থেকে ডেটা অ্যাক্সেস করার জন্য ক্লিক clickListener কলব্যাকের জন্য শুধুমাত্র night.nightId প্রয়োজন। আপনার সমাপ্ত SleepNightListener ক্লাসটি নীচের কোডের মতো হওয়া উচিত।
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
   fun onClick(night: SleepNight) = clickListener(night.nightId)
}
  1. list_item_sleep_night.xml খুলুন।
  2. data ব্লকের ভিতরে, ডাটা বাইন্ডিং এর মাধ্যমে SleepNightListener ক্লাস উপলব্ধ করতে একটি নতুন ভেরিয়েবল যোগ করুন। নতুন <variable> clickListener. একটি name দিন। com.example.android.trackmysleepquality.sleeptracker.SleepNightListener ক্লাসের সম্পূর্ণ যোগ্য নামের type সেট করুন, যেমনটি নীচে দেখানো হয়েছে। আপনি এখন এই লেআউট থেকে SleepNightListeneronClick() ফাংশন অ্যাক্সেস করতে পারেন।
<variable
            name="clickListener"
            type="com.example.android.trackmysleepquality.sleeptracker.SleepNightListener" />
  1. এই তালিকার আইটেমের যেকোনো অংশে ক্লিক শুনতে, ConstraintLayoutandroid:onClick অ্যাট্রিবিউট যোগ করুন।

    একটি ডেটা বাইন্ডিং ল্যাম্বডা ব্যবহার করে clickListener:onClick(sleep) এ বৈশিষ্ট্য সেট করুন, যেমনটি নীচে দেখানো হয়েছে:
android:onClick="@{() -> clickListener.onClick(sleep)}"

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

  1. SleepNightAdapter.kt খুলুন।
  2. SleepNightAdapter ক্লাসের কনস্ট্রাক্টর পরিবর্তন করুন একটি ভাল ক্লিক লিস্টেনার পেতে val clickListener: SleepNightListener । যখন অ্যাডাপ্টারটি ViewHolder আবদ্ধ করে, তখন এটি এই ক্লিক শ্রোতার সাথে এটি প্রদান করতে হবে।
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
  1. onBindViewHolder() -এ, ক্লিক শ্রোতাকে ViewHolder পাস করতে holder.bind() এ কল আপডেট করুন। আপনি একটি কম্পাইলার ত্রুটি পাবেন কারণ আপনি ফাংশন কলে একটি প্যারামিটার যোগ করেছেন।
holder.bind(getItem(position)!!, clickListener)
  1. bind() করতে clickListener প্যারামিটার যোগ করুন। এটি করার জন্য, ত্রুটির উপর কার্সার রাখুন, এবং নীচের স্ক্রিনশটে দেখানো হিসাবে ত্রুটিটির উপর Alt+Enter (Windows) বা Option+Enter (Mac) টিপুন।

  1. ViewHolder ক্লাসের ভিতরে, bind() ফাংশনের ভিতরে, binding অবজেক্টে ক্লিক লিসেনারকে বরাদ্দ করুন। আপনি একটি ত্রুটি দেখতে পাচ্ছেন কারণ আপনাকে বাইন্ডিং অবজেক্ট আপডেট করতে হবে।
binding.clickListener = clickListener
  1. ডেটা বাইন্ডিং আপডেট করতে, আপনার প্রকল্প পরিষ্কার করুন এবং পুনর্নির্মাণ করুন। (আপনাকে ক্যাশেও অকার্যকর করতে হতে পারে।) সুতরাং, আপনি অ্যাডাপ্টার কনস্ট্রাক্টর থেকে একটি ক্লিক লিসেনার নিয়েছেন এবং এটিকে ভিউ হোল্ডার এবং বাইন্ডিং অবজেক্টে পৌঁছে দিয়েছেন।

ধাপ 3: একটি আইটেম ট্যাপ করা হলে একটি টোস্ট প্রদর্শন করুন

একটি ক্লিক ক্যাপচার করার জন্য আপনার কাছে এখন কোড আছে, কিন্তু একটি তালিকা আইটেম ট্যাপ করা হলে কী হয় তা আপনি বাস্তবায়ন করেননি। একটি আইটেম ক্লিক করা হলে nightId দেখানো একটি টোস্ট প্রদর্শন করা সবচেয়ে সহজ প্রতিক্রিয়া। এটি যাচাই করে যে যখন একটি তালিকা আইটেম ক্লিক করা হয়, সঠিক nightId ক্যাপচার করা হয় এবং পাস করা হয়।

  1. SleepTrackerFragment.kt খুলুন।
  2. onCreateView() এ, adapter ভেরিয়েবলটি খুঁজুন। লক্ষ্য করুন যে এটি একটি ত্রুটি দেখায়, কারণ এটি এখন একটি ক্লিক শ্রোতা পরামিতি আশা করে।
  3. SleepNightAdapter এ ল্যাম্বডা দিয়ে একটি ক্লিক শ্রোতাকে সংজ্ঞায়িত করুন। এই সাধারণ ল্যাম্বডা শুধু একটি টোস্ট প্রদর্শন করে যা nightId দেখাচ্ছে, যেমনটি নীচে দেখানো হয়েছে। আপনাকে Toast আমদানি করতে হবে। নীচে সম্পূর্ণ আপডেট সংজ্ঞা আছে.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
   Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})
  1. অ্যাপটি চালান, আইটেমগুলিতে আলতো চাপুন এবং যাচাই করুন যে তারা সঠিক nightId সহ একটি টোস্ট প্রদর্শন করে। যেহেতু আইটেমগুলির nightId মান বাড়ছে, এবং অ্যাপটি সবচেয়ে সাম্প্রতিক রাতটি প্রথমে প্রদর্শন করে, সর্বনিম্ন nightId সহ আইটেমটি তালিকার নীচে রয়েছে৷

এই টাস্কে, RecyclerView এর একটি আইটেম ক্লিক করা হলে আপনি আচরণ পরিবর্তন করেন, যাতে একটি টোস্ট দেখানোর পরিবর্তে, অ্যাপটি একটি বিস্তারিত অংশে নেভিগেট করবে যা ক্লিক করা রাত সম্পর্কে আরও তথ্য দেখায়।

ধাপ 1: ক্লিকে নেভিগেট করুন

এই ধাপে, শুধুমাত্র একটি টোস্ট দেখানোর পরিবর্তে, আপনি SleepTrackerFragment-এর onCreateView onCreateView() এ ক্লিক লিসেনার ল্যাম্বডা পরিবর্তন করে nightId SleepTrackerFragment করতে পারেন এবং SleepTrackerViewModel এ নেভিগেশন ট্রিগার SleepDetailFragment

ক্লিক হ্যান্ডলার ফাংশন সংজ্ঞায়িত করুন:

  1. SleepTrackerViewModel.kt খুলুন।
  2. SleepTrackerViewModel এর ভিতরে, শেষের দিকে, onSleepNightClicked() ক্লিক হ্যান্ডলার ফাংশনটি সংজ্ঞায়িত করুন।
fun onSleepNightClicked(id: Long) {

}
  1. id onSleepNightClicked() এর ভিতরে, ক্লিক করা ঘুমের রাতের পাস করা _navigateToSleepDetail সেট করে নেভিগেশন ট্রিগার করুন।
fun onSleepNightClicked(id: Long) {
   _navigateToSleepDetail.value = id
}
  1. _navigateToSleepDetail বাস্তবায়ন করুন। যেমন আপনি আগে করেছেন, নেভিগেশন অবস্থার জন্য একটি private MutableLiveData সংজ্ঞায়িত করুন। এবং একটি পাবলিক val ভাল এটি সঙ্গে যেতে.
private val _navigateToSleepDetail = MutableLiveData<Long>()
val navigateToSleepDetail
   get() = _navigateToSleepDetail
  1. অ্যাপটি নেভিগেট করা শেষ করার পরে কল করার পদ্ধতিটি সংজ্ঞায়িত করুন। এটিকে onSleepDetailNavigated() কল করুন এবং এর মান null এ সেট করুন।
fun onSleepDetailNavigated() {
    _navigateToSleepDetail.value = null
}

ক্লিক হ্যান্ডলারকে কল করতে কোড যোগ করুন:

  1. SleepTrackerFragment.kt খুলুন এবং কোডে স্ক্রোল করুন যা অ্যাডাপ্টার তৈরি করে এবং একটি টোস্ট দেখানোর জন্য SleepNightListener সংজ্ঞায়িত করে।
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
   Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})
  1. একটি আইটেম ট্যাপ করা হলে sleepTrackerViewModel ক্লিক হ্যান্ডলার, onSleepNighClicked() কল করতে টোস্টের নীচে নিম্নলিখিত কোডটি যোগ করুন। nightId পাস করুন, তাই ভিউ মডেল জানে কোন রাতে ঘুমাতে হবে। এটি আপনাকে একটি ত্রুটির সাথে ছেড়ে দেয়, কারণ আপনি onSleepNightClicked() এখনও সংজ্ঞায়িত করেননি৷ আপনি আপনার ইচ্ছামত টোস্ট রাখতে, মন্তব্য করতে বা মুছতে পারেন।
sleepTrackerViewModel.onSleepNightClicked(nightId)

ক্লিকগুলি পর্যবেক্ষণ করতে কোড যোগ করুন:

  1. SleepTrackerFragment.kt খুলুন।
  2. onCreateView() -এ, manager ঘোষণার ঠিক উপরে, নতুন navigateToSleepDetail LiveData পর্যবেক্ষণ করতে কোড যোগ করুন। যখন navigateToSleepDetail পরিবর্তিত হয়, তখন SleepDetailFragment এ নেভিগেট করুন, night পেরিয়ে যান, তারপর onSleepDetailNavigated() কল করুন। যেহেতু আপনি এটি পূর্ববর্তী কোডল্যাবে আগে করেছেন, এখানে কোডটি রয়েছে:
sleepTrackerViewModel.navigateToSleepDetail.observe(this, Observer { night ->
            night?.let {
              this.findNavController().navigate(
                        SleepTrackerFragmentDirections
                                .actionSleepTrackerFragmentToSleepDetailFragment(night))
               sleepTrackerViewModel.onSleepDetailNavigated()
            }
        })
  1. আপনার কোড চালান, একটি আইটেম ক্লিক করুন, এবং ... অ্যাপ্লিকেশন ক্র্যাশ.

বাইন্ডিং অ্যাডাপ্টারগুলিতে নাল মানগুলি পরিচালনা করুন:

  1. ডিবাগ মোডে অ্যাপটি আবার চালান। একটি আইটেম আলতো চাপুন, এবং ত্রুটিগুলি দেখাতে লগগুলি ফিল্টার করুন৷ এটি নীচের মত কিছু সহ একটি স্ট্যাক ট্রেস দেখাবে।
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter item

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

যাইহোক, দেখা যাচ্ছে যে এই নতুন ক্লিক-হ্যান্ডলিং মেকানিজমের সাহায্যে, বাইন্ডিং অ্যাডাপ্টারের জন্য item জন্য একটি null মান সহ কল ​​করা সম্ভব। বিশেষ করে, যখন অ্যাপটি শুরু হয়, তখন LiveData null হিসেবে শুরু হয়, তাই আপনাকে প্রতিটি অ্যাডাপ্টারের সাথে নাল চেক যোগ করতে হবে।

  1. BindingUtils.kt এ, বাইন্ডিং অ্যাডাপ্টারের প্রতিটির জন্য, item আর্গুমেন্টের ধরনটিকে বাতিল করে পরিবর্তন করুন এবং বডিটি item?.let{...} । উদাহরণস্বরূপ, sleepQualityString এর জন্য আপনার অ্যাডাপ্টার এইরকম দেখাবে। একইভাবে অন্যান্য অ্যাডাপ্টার পরিবর্তন করুন।
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight?) {
   item?.let {
       text = convertNumericQualityToString(item.sleepQuality, context.resources)
   }
}
  1. আপনার অ্যাপ চালান। একটি আইটেম আলতো চাপুন, এবং একটি বিশদ দৃশ্য খোলে।

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: RecyclerViewClickHandler

একটি RecyclerView-এ আইটেমগুলিকে ক্লিকের প্রতিক্রিয়া জানাতে, RecyclerView এ আইটেমগুলির তালিকায় ক্লিক শ্রোতাদের সংযুক্ত করুন এবং ViewHolder এ ক্লিকগুলি ViewModel করুন৷

একটি RecyclerView এ আইটেম তৈরি করতে ক্লিকগুলিতে প্রতিক্রিয়া জানাতে, আপনাকে নিম্নলিখিতগুলি করতে হবে:

  • একটি শ্রোতা শ্রেণী তৈরি করুন যা একটি ল্যাম্বডা নেয় এবং এটি একটি onClick() ফাংশনে বরাদ্দ করে।
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
   fun onClick(night: SleepNight) = clickListener(night.nightId)
}
  • ভিউতে ক্লিক লিসেনার সেট করুন।
android:onClick="@{() -> clickListener.onClick(sleep)}"
  • ভিউ হোল্ডারে অ্যাডাপ্টার কনস্ট্রাক্টরের কাছে ক্লিক লিসেনার পাস করুন এবং বাইন্ডিং অবজেক্টে যোগ করুন।
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()
holder.bind(getItem(position)!!, clickListener)
binding.clickListener = clickListener
  • যে টুকরোটি রিসাইক্লার ভিউ দেখায়, যেখানে আপনি অ্যাডাপ্টার তৈরি করেন, অ্যাডাপ্টারে ল্যাম্বডা পাস করে একটি ক্লিক লিসেনারকে সংজ্ঞায়িত করুন।
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
      sleepTrackerViewModel.onSleepNightClicked(nightId)
})
  • ভিউ মডেলে ক্লিক হ্যান্ডলার প্রয়োগ করুন। তালিকার আইটেমগুলিতে ক্লিকের জন্য, এটি সাধারণত একটি বিশদ খণ্ডে নেভিগেশন ট্রিগার করে।

উদাসীনতা কোর্স:

অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:

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

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলিকে তারা যতটা কম বা যতটা চান ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলি ব্যবহার করুন।

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

অনুমান করুন যে আপনার অ্যাপটিতে একটি RecyclerView রয়েছে যা একটি কেনাকাটার তালিকায় আইটেমগুলি প্রদর্শন করে। আপনার অ্যাপটি একটি ক্লিক-শ্রোতা শ্রেণীও সংজ্ঞায়িত করে:

class ShoppingListItemListener(val clickListener: (itemId: Long) -> Unit) {
    fun onClick(cartItem: CartItem) = clickListener(cartItem.itemId)
}

আপনি কিভাবে ShoppingListItemListener ডেটা বাইন্ডিংয়ের জন্য উপলব্ধ করবেন? একটা নির্বাচন করুন.

RecyclerView যে লেআউট ফাইলটিতে RecyclerView রয়েছে যা শপিং তালিকা প্রদর্শন করে, সেখানে একটি <data> ভেরিয়েবল যোগ করুন ShoppingListItemListener এর জন্য।

▢ শপিং লিস্টে একটি একক সারির লেআউট সংজ্ঞায়িত করে এমন লেআউট ফাইলে, ShoppingListItemListener এর জন্য একটি <data> ভেরিয়েবল যোগ করুন।

ShoppingListItemListener ক্লাসে, ডেটা বাইন্ডিং সক্ষম করতে একটি ফাংশন যোগ করুন:

fun onBinding (cartItem: CartItem) {dataBindingEnable(true)}

ShoppingListItemListener ক্লাসে, onClick() ফাংশনের ভিতরে, ডেটা বাইন্ডিং সক্ষম করতে একটি কল যোগ করুন:

fun onClick(cartItem: CartItem) = { 
    clickListener(cartItem.itemId)
    dataBindingEnable(true)
}

প্রশ্ন 2

RecyclerView ক্লিকের প্রতিক্রিয়া জানাতে আইটেমগুলি তৈরি করতে আপনি android:onClick বৈশিষ্ট্যটি কোথায় যোগ করবেন? প্রযোজ্য সব নির্বাচন করুন.

▢ যে লেআউট ফাইলটি RecyclerView প্রদর্শন করে, সেখানে এটিকে <androidx.recyclerview.widget.RecyclerView> RecyclerView করুন

▢ সারির একটি আইটেমের জন্য লেআউট ফাইলে এটি যোগ করুন। আপনি যদি সম্পূর্ণ আইটেমটি ক্লিকযোগ্য হতে চান, তাহলে সারিতে থাকা আইটেমগুলিকে প্যারেন্ট ভিউতে যোগ করুন।

▢ সারির একটি আইটেমের জন্য লেআউট ফাইলে এটি যোগ করুন। আপনি যদি আইটেমটিতে একটি একক TextView ক্লিকযোগ্য হতে চান তবে এটিকে <TextView> এ যোগ করুন।

▢ সর্বদা এটি MainActivity এর জন্য লেআউট ফাইল যোগ করুন।

পরবর্তী পাঠ শুরু করুন: 7.5: RecyclerView-এ হেডার