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

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

ধাপ 1: স্টার্টার অ্যাপ পান
- GitHub থেকে RecyclerViewClickHandler-Starter কোড ডাউনলোড করুন এবং Android স্টুডিওতে প্রকল্পটি খুলুন।
- স্টার্টার স্লিপ-ট্র্যাকার অ্যাপ তৈরি করুন এবং চালান।
[ঐচ্ছিক] আপনি যদি আগের কোডল্যাব থেকে অ্যাপটি ব্যবহার করতে চান তাহলে আপনার অ্যাপ আপডেট করুন
আপনি যদি এই কোডল্যাবের জন্য GitHub-এ দেওয়া স্টার্টার অ্যাপ থেকে কাজ করতে যাচ্ছেন, তাহলে পরবর্তী ধাপে যান।
আপনি যদি আপনার নিজের স্লিপ-ট্র্যাকার অ্যাপটি ব্যবহার করা চালিয়ে যেতে চান যা আপনি পূর্ববর্তী কোডল্যাবে তৈরি করেছেন, তাহলে আপনার বিদ্যমান অ্যাপটি আপডেট করতে নীচের নির্দেশাবলী অনুসরণ করুন যাতে এটিতে বিশদ-স্ক্রীন খণ্ডের কোড থাকে।
- এমনকি যদি আপনি আপনার বিদ্যমান অ্যাপের সাথে চালিয়ে যাচ্ছেন, GitHub থেকে RecyclerViewClickHandler-Starter কোডটি পান যাতে আপনি ফাইলগুলি অনুলিপি করতে পারেন।
-
sleepdetailপ্যাকেজে সমস্ত ফাইল কপি করুন। -
layoutফোল্ডারে, ফাইলটি অনুলিপি করুনfragment_sleep_detail.xml। -
navigation.xmlএর আপডেট করা বিষয়বস্তু কপি করুন, যাsleep_detail_fragmentএর জন্য নেভিগেশন যোগ করে। -
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>-
res/values/stringsএ নিম্নলিখিত স্ট্রিং রিসোর্স যোগ করুন:
<string name="close">Close</string>- ডেটা বাইন্ডিং আপডেট করতে আপনার অ্যাপ পরিষ্কার করুন এবং পুনর্নির্মাণ করুন।
ধাপ 2: ঘুমের বিবরণ স্ক্রিনের জন্য কোডটি পরীক্ষা করুন
এই কোডল্যাবে, আপনি একটি ক্লিক হ্যান্ডলার প্রয়োগ করেন যা একটি খণ্ডে নেভিগেট করে যা ক্লিক করা ঘুমের রাতের বিবরণ দেখায়। আপনার স্টার্টার কোডে ইতিমধ্যেই এই SleepDetailFragment জন্য ফ্র্যাগমেন্ট এবং নেভিগেশন গ্রাফ রয়েছে, কারণ এটি বেশ কিছুটা কোড, এবং টুকরো এবং নেভিগেশন এই কোডল্যাবের অংশ নয়। নিম্নলিখিত কোডের সাথে নিজেকে পরিচিত করুন:
- আপনার অ্যাপে,
sleepdetailপ্যাকেজ খুঁজুন। এই প্যাকেজটিতে একটি খণ্ডের টুকরো, ভিউ মডেল এবং মডেল ফ্যাক্টরি রয়েছে যা এক রাতের ঘুমের বিবরণ প্রদর্শন করে। -
sleepdetailপ্যাকেজে,SleepDetailViewModelএর কোডটি খুলুন এবং পরিদর্শন করুন। এই ভিউ মডেলটি কনস্ট্রাক্টরে একটিSleepNightএবং একটি DAO-এর চাবিকাঠি নেয়।
ক্লাসের বডিতে প্রদত্ত কীটির জন্যSleepNightপাওয়ার জন্য কোড রয়েছে এবং ক্লোজ বোতাম টিপলেSleepTrackerFragmentএ নেভিগেশন নিয়ন্ত্রণ করতেnavigateToSleepTrackerভেরিয়েবল রয়েছে।
getNightWithId()ফাংশন একটিLiveData<SleepNight>প্রদান করে এবংSleepDatabaseDao(databaseপ্যাকেজে) সংজ্ঞায়িত করা হয়। -
sleepdetailপ্যাকেজে,SleepDetailFragmentকোডটি খুলুন এবং পরিদর্শন করুন। ডেটা বাইন্ডিং, ভিউ মডেল এবং নেভিগেশনের জন্য পর্যবেক্ষকের সেটআপটি লক্ষ্য করুন। -
sleepdetailপ্যাকেজে,SleepDetailViewModelFactoryএর কোডটি খুলুন এবং পরিদর্শন করুন। - লেআউট ফোল্ডারে,
fragment_sleep_detail.xmlপরিদর্শন করুন। ভিউ মডেল থেকে প্রতিটি ভিউতে ডেটা প্রদর্শন করার জন্য<data>ট্যাগে সংজ্ঞায়িতsleepDetailViewModelভেরিয়েবলটি লক্ষ্য করুন।
লেআউটে একটিConstraintLayoutরয়েছে যাতে ঘুমের মানের জন্য একটিImageView, গুণমানের রেটিং-এর জন্য একটিTextView, ঘুমের দৈর্ঘ্যের জন্য একটিTextViewএবং বিশদ খণ্ডটি বন্ধ করার জন্য একটিButtonরয়েছে। -
navigation.xmlফাইলটি খুলুন।sleep_tracker_fragmentএর জন্য,sleep_detail_fragmentএর জন্য নতুন ক্রিয়া লক্ষ্য করুন।
নতুন অ্যাকশন,action_sleep_tracker_fragment_to_sleepDetailFragmentহল স্লিপ ট্র্যাকার ফ্র্যাগমেন্ট থেকে বিশদ স্ক্রিনে নেভিগেশন।
এই টাস্কে, আপনি ট্যাপ করা আইটেমের জন্য একটি বিশদ স্ক্রীন দেখিয়ে ব্যবহারকারীর ট্যাপের প্রতিক্রিয়া জানাতে RecyclerView আপডেট করেন।
ক্লিকগুলি গ্রহণ করা এবং সেগুলি পরিচালনা করা একটি দুই-অংশের কাজ: প্রথমত, আপনাকে ক্লিক শুনতে এবং গ্রহণ করতে হবে এবং কোন আইটেমটি ক্লিক করা হয়েছে তা নির্ধারণ করতে হবে৷ তারপরে, আপনাকে একটি ক্রিয়া সহ ক্লিকে প্রতিক্রিয়া জানাতে হবে।
সুতরাং, এই অ্যাপের জন্য একটি ক্লিক শ্রোতা যোগ করার জন্য সেরা জায়গা কি?
-
SleepTrackerFragmentঅনেক ভিউ হোস্ট করে, এবং তাই ফ্র্যাগমেন্ট লেভেলে ক্লিক ইভেন্ট শুনলে কোন আইটেমটি ক্লিক করা হয়েছে তা আপনাকে বলবে না। এটি আপনাকে বলবে না যে এটি একটি আইটেম যা ক্লিক করা হয়েছিল নাকি অন্য UI উপাদানগুলির মধ্যে একটি। -
RecyclerViewস্তরে শুনলে, ব্যবহারকারীর ক্লিক করা তালিকার ঠিক কোন আইটেমটি বের করা কঠিন। - একটি ক্লিক করা আইটেম সম্পর্কে তথ্য পাওয়ার সর্বোত্তম গতি হল
ViewHolderঅবজেক্টে, যেহেতু এটি একটি তালিকা আইটেম প্রতিনিধিত্ব করে।
যদিও ViewHolder ক্লিকগুলি শোনার জন্য একটি দুর্দান্ত জায়গা, এটি সাধারণত সেগুলি পরিচালনা করার জন্য সঠিক জায়গা নয়৷ সুতরাং, ক্লিকগুলি পরিচালনা করার জন্য সেরা জায়গা কি?
-
Adapterভিউতে ডেটা আইটেম প্রদর্শন করে, যাতে আপনি অ্যাডাপ্টারে ক্লিকগুলি পরিচালনা করতে পারেন। যাইহোক, অ্যাডাপ্টারের কাজ হল প্রদর্শনের জন্য ডেটা মানিয়ে নেওয়া, অ্যাপ লজিকের সাথে ডিল করা নয়। - আপনার সাধারণত
ViewModelএ ক্লিকগুলি পরিচালনা করা উচিত, কারণ ক্লিকের প্রতিক্রিয়ায় কী ঘটতে হবে তা নির্ধারণের জন্যViewModelডেটা এবং যুক্তিতে অ্যাক্সেস রয়েছে৷
ধাপ 1: একটি ক্লিক লিসেনার তৈরি করুন এবং আইটেম লেআউট থেকে এটি ট্রিগার করুন
-
sleeptrackerফোল্ডারে, SleepNightAdapter.kt খুলুন। - ফাইলের শেষে, শীর্ষ স্তরে, একটি নতুন শ্রোতা শ্রেণি তৈরি করুন,
SleepNightListener।
class SleepNightListener() {
}-
SleepNightListenerক্লাসের ভিতরে, একটিonClick()ফাংশন যোগ করুন। যখন একটি তালিকা আইটেম প্রদর্শন করে এমন ভিউটিতে ক্লিক করা হয়, ভিউটি এটিকেonClick()ফাংশন বলে। (আপনি পরে এই ফাংশনে ভিউয়েরandroid:onClickবৈশিষ্ট্য সেট করবেন।)
class SleepNightListener() {
fun onClick() =
}-
onClick()এSleepNightটাইপের একটি ফাংশন আর্গুমেন্টnightযোগ করুন। ভিউটি জানে যে এটি কোন আইটেমটি প্রদর্শন করছে এবং সেই তথ্যটি ক্লিক পরিচালনা করার জন্য প্রেরণ করা প্রয়োজন।
class SleepNightListener() {
fun onClick(night: SleepNight) =
}-
onClick()কি করে তা সংজ্ঞায়িত করতে,SleepNightListenerএর কনস্ট্রাক্টরে একটিclickListenerকলব্যাক প্রদান করুন এবং এটিonClick()এ বরাদ্দ করুন।
Lambda যেটি ক্লিক পরিচালনা করে একটি নাম দেওয়া,clickListener, এটি ক্লাসের মধ্যে পাস করার সময় ট্র্যাক রাখতে সাহায্য করে। ডাটাবেস থেকে ডেটা অ্যাক্সেস করার জন্যclickListenerকলব্যাকের জন্য শুধুমাত্রnight.nightIdপ্রয়োজন। আপনার সমাপ্তSleepNightListenerক্লাসটি নীচের কোডের মতো হওয়া উচিত।
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
fun onClick(night: SleepNight) = clickListener(night.nightId)
}- list_item_sleep_night.xml খুলুন।
-
dataব্লকের ভিতরে, ডাটা বাইন্ডিং এর মাধ্যমেSleepNightListenerক্লাস উপলব্ধ করতে একটি নতুন ভেরিয়েবল যোগ করুন। নতুন<variable>ক্লিক লিসটেনারের একটিnameদিনclickListener.com.example.android.trackmysleepquality.sleeptracker.SleepNightListenerক্লাসের সম্পূর্ণ যোগ্য নামেরtypeসেট করুন, যেমনটি নীচে দেখানো হয়েছে। আপনি এখন এই লেআউট থেকেSleepNightListenerএonClick()ফাংশন অ্যাক্সেস করতে পারেন।
<variable
name="clickListener"
type="com.example.android.trackmysleepquality.sleeptracker.SleepNightListener" />- এই তালিকা আইটেমের যেকোনো অংশে ক্লিক শোনার জন্য,
ConstraintLayoutএandroid:onClickঅ্যাট্রিবিউট যোগ করুন।
একটি ডেটা বাইন্ডিং ল্যাম্বডা ব্যবহার করেclickListener:onClick(sleep)এ বৈশিষ্ট্য সেট করুন, যেমনটি নীচে দেখানো হয়েছে:
android:onClick="@{() -> clickListener.onClick(sleep)}"ধাপ 2: ভিউ হোল্ডার এবং বাইন্ডিং অবজেক্টে ক্লিক লিসেনার পাস করুন
- SleepNightAdapter.kt খুলুন।
-
SleepNightAdapterক্লাসের কনস্ট্রাক্টর পরিবর্তন করুন একটিval clickListener: SleepNightListener। যখন অ্যাডাপ্টারটিViewHolderআবদ্ধ করে, তখন এটি এই ক্লিক শ্রোতার সাথে এটি প্রদান করতে হবে।
class SleepNightAdapter(val clickListener: SleepNightListener):
ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {-
onBindViewHolder()এ, ক্লিক শ্রোতাকেViewHolderপাস করতেholder.bind()এ কল আপডেট করুন। আপনি একটি কম্পাইলার ত্রুটি পাবেন কারণ আপনি ফাংশন কলে একটি প্যারামিটার যোগ করেছেন।
holder.bind(getItem(position)!!, clickListener)-
bind()করতেclickListenerপ্যারামিটার যোগ করুন। এটি করার জন্য, ত্রুটির উপর কার্সার রাখুন, এবং নীচের স্ক্রিনশটে দেখানো হিসাবে ত্রুটিটির উপরAlt+Enter(Windows) বাOption+Enter(Mac) টিপুন।
-
ViewHolderক্লাসের ভিতরে,bind()ফাংশনের ভিতরে, ক্লিক লিসেনারকেbindingঅবজেক্টে বরাদ্দ করুন। আপনি একটি ত্রুটি দেখতে পাচ্ছেন কারণ আপনাকে বাইন্ডিং অবজেক্ট আপডেট করতে হবে।
binding.clickListener = clickListener- ডেটা বাইন্ডিং আপডেট করতে, আপনার প্রকল্প পরিষ্কার করুন এবং পুনর্নির্মাণ করুন । (আপনাকে ক্যাশেও অকার্যকর করতে হতে পারে।) সুতরাং, আপনি অ্যাডাপ্টার কনস্ট্রাক্টর থেকে একটি ক্লিক লিসেনার নিয়েছেন এবং এটিকে ভিউ হোল্ডার এবং বাইন্ডিং অবজেক্টে পৌঁছে দিয়েছেন।
ধাপ 3: একটি আইটেম ট্যাপ করা হলে একটি টোস্ট প্রদর্শন করুন
একটি ক্লিক ক্যাপচার করার জন্য আপনার কাছে এখন কোড আছে, কিন্তু একটি তালিকা আইটেম ট্যাপ করা হলে কী হয় তা আপনি বাস্তবায়ন করেননি। একটি আইটেম ক্লিক করা হলে nightId দেখানো একটি টোস্ট প্রদর্শন করা সবচেয়ে সহজ প্রতিক্রিয়া। এটি যাচাই করে যে যখন একটি তালিকা আইটেম ক্লিক করা হয়, সঠিক nightId ক্যাপচার করা হয় এবং পাস করা হয়।
- SleepTrackerFragment.kt খুলুন।
-
onCreateView()এ,adapterভেরিয়েবলটি খুঁজুন। লক্ষ্য করুন যে এটি একটি ত্রুটি দেখায়, কারণ এটি এখন একটি ক্লিক শ্রোতা পরামিতি আশা করে। -
SleepNightAdapterএ ল্যাম্বডা দিয়ে একটি ক্লিক শ্রোতাকে সংজ্ঞায়িত করুন। এই সাধারণ ল্যাম্বডা শুধু একটি টোস্ট প্রদর্শন করে যাnightIdদেখাচ্ছে, যেমনটি নীচে দেখানো হয়েছে। আপনাকেToastআমদানি করতে হবে। নীচে সম্পূর্ণ আপডেট সংজ্ঞা আছে.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})- অ্যাপটি চালান, আইটেমগুলিতে আলতো চাপুন এবং যাচাই করুন যে তারা সঠিক
nightIdসহ একটি টোস্ট প্রদর্শন করে। যেহেতু আইটেমগুলিরnightIdমান বাড়ছে, এবং অ্যাপটি সবচেয়ে সাম্প্রতিক রাতটি প্রথমে প্রদর্শন করে, সর্বনিম্নnightIdসহ আইটেমটি তালিকার নীচে রয়েছে৷
এই টাস্কে, RecyclerView তে একটি আইটেম ক্লিক করা হলে আপনি আচরণ পরিবর্তন করেন, যাতে টোস্ট দেখানোর পরিবর্তে অ্যাপটি একটি বিশদ অংশে নেভিগেট করবে যা ক্লিক করা রাত সম্পর্কে আরও তথ্য দেখায়।
ধাপ 1: ক্লিকে নেভিগেট করুন
এই ধাপে, শুধুমাত্র একটি টোস্ট প্রদর্শন করার পরিবর্তে, আপনি SleepTrackerViewModel এ nightId পাস করতে এবং SleepDetailFragment এ নেভিগেশন ট্রিগার করতে SleepTrackerFragment এর onCreateView() এ ক্লিক লিসেনার ল্যাম্বডা পরিবর্তন করুন।
ক্লিক হ্যান্ডলার ফাংশন সংজ্ঞায়িত করুন:
- SleepTrackerViewModel.kt খুলুন।
-
SleepTrackerViewModelভিতরে, শেষের দিকে,onSleepNightClicked()ক্লিক হ্যান্ডলার ফাংশনটি সংজ্ঞায়িত করুন।
fun onSleepNightClicked(id: Long) {
}-
onSleepNightClicked()এর ভিতরে, ক্লিক করা ঘুমের রাতের পাস করাid_navigateToSleepDetailসেট করে নেভিগেশন ট্রিগার করুন।
fun onSleepNightClicked(id: Long) {
_navigateToSleepDetail.value = id
}-
_navigateToSleepDetailবাস্তবায়ন করুন। যেমন আপনি আগে করেছেন, নেভিগেশন অবস্থার জন্য একটিprivate MutableLiveDataসংজ্ঞায়িত করুন। এবং এটি সঙ্গে যেতে একটি পাবলিক gettableval.
private val _navigateToSleepDetail = MutableLiveData<Long>()
val navigateToSleepDetail
get() = _navigateToSleepDetail- অ্যাপটি নেভিগেট করা শেষ করার পরে কল করার পদ্ধতিটি সংজ্ঞায়িত করুন।
onSleepDetailNavigated()কল করুন এবং এর মানnullএ সেট করুন।
fun onSleepDetailNavigated() {
_navigateToSleepDetail.value = null
}ক্লিক হ্যান্ডলারকে কল করতে কোড যোগ করুন:
- SleepTrackerFragment.kt খুলুন এবং কোডে স্ক্রোল করুন যা অ্যাডাপ্টার তৈরি করে এবং একটি টোস্ট দেখানোর জন্য
SleepNightListenerসংজ্ঞায়িত করে।
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})- একটি আইটেম ট্যাপ করা হলে
sleepTrackerViewModelক্লিক হ্যান্ডলার,onSleepNighClicked()কল করতে টোস্টের নীচে নিম্নলিখিত কোডটি যোগ করুন৷nightIdপাস করুন, তাই ভিউ মডেল জানে কোন রাতে ঘুমাতে হবে। এটি আপনাকে একটি ত্রুটির সাথে ছেড়ে দেয়, কারণ আপনি এখনওonSleepNightClicked()এর সংজ্ঞা দেননি৷ আপনি আপনার ইচ্ছামত টোস্ট রাখতে, মন্তব্য করতে বা মুছতে পারেন।
sleepTrackerViewModel.onSleepNightClicked(nightId)ক্লিকগুলি পর্যবেক্ষণ করতে কোড যোগ করুন:
- SleepTrackerFragment.kt খুলুন।
-
onCreateView()-এ,managerঘোষণার ঠিক উপরে, নতুনnavigateToSleepDetailLiveDataপর্যবেক্ষণ করতে কোড যোগ করুন। যখনnavigateToSleepDetailপরিবর্তিত হয়, তখনSleepDetailFragmentএ নেভিগেট করুন,nightপেরিয়ে যান, তারপরonSleepDetailNavigated()কল করুন। যেহেতু আপনি এটি পূর্ববর্তী কোডল্যাবে আগে করেছেন, এখানে কোডটি রয়েছে:
sleepTrackerViewModel.navigateToSleepDetail.observe(this, Observer { night ->
night?.let {
this.findNavController().navigate(
SleepTrackerFragmentDirections
.actionSleepTrackerFragmentToSleepDetailFragment(night))
sleepTrackerViewModel.onSleepDetailNavigated()
}
})- আপনার কোড চালান, একটি আইটেম ক্লিক করুন, এবং ... অ্যাপ্লিকেশন ক্র্যাশ.
বাইন্ডিং অ্যাডাপ্টারগুলিতে নাল মানগুলি পরিচালনা করুন:
- ডিবাগ মোডে অ্যাপটি আবার চালান। একটি আইটেম আলতো চাপুন, এবং ত্রুটিগুলি দেখাতে লগগুলি ফিল্টার করুন৷ এটি নীচের মত কিছু সহ একটি স্ট্যাক ট্রেস দেখাবে।
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter itemদুর্ভাগ্যবশত, স্ট্যাক ট্রেস এটি স্পষ্ট করে না যে এই ত্রুটিটি কোথায় শুরু হয়েছে। ডেটা বাইন্ডিংয়ের একটি অসুবিধা হল এটি আপনার কোড ডিবাগ করা কঠিন করে তুলতে পারে। আপনি যখন কোনো আইটেমে ক্লিক করেন তখন অ্যাপটি ক্র্যাশ হয়ে যায় এবং ক্লিক পরিচালনার জন্য একমাত্র নতুন কোড।
যাইহোক, দেখা যাচ্ছে যে এই নতুন ক্লিক-হ্যান্ডলিং মেকানিজমের সাহায্যে, বাইন্ডিং অ্যাডাপ্টারের জন্য item জন্য একটি null মান সহ কল করা সম্ভব। বিশেষ করে, যখন অ্যাপটি শুরু হয়, তখন LiveData null হিসাবে শুরু হয়, তাই আপনাকে প্রতিটি অ্যাডাপ্টারে নাল চেক যোগ করতে হবে।
-
BindingUtils.ktএ, বাইন্ডিং অ্যাডাপ্টারের প্রতিটির জন্য,itemআর্গুমেন্টের ধরনটিকে বাতিল করে পরিবর্তন করুন এবং বডিটিitem?.let{...}। উদাহরণস্বরূপ,sleepQualityStringএর জন্য আপনার অ্যাডাপ্টার এইরকম দেখাবে। একইভাবে অন্যান্য অ্যাডাপ্টার পরিবর্তন করুন।
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight?) {
item?.let {
text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
}- আপনার অ্যাপ চালান। একটি আইটেম আলতো চাপুন, এবং একটি বিশদ দৃশ্য খোলে।
অ্যান্ড্রয়েড স্টুডিও প্রকল্প: RecyclerViewClickHandler ।
একটি 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 রয়েছে যা শপিং তালিকা প্রদর্শন করে, সেখানে একটি <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> এ যোগ করুন
▢ সারির একটি আইটেমের জন্য লেআউট ফাইলে এটি যোগ করুন। আপনি যদি সম্পূর্ণ আইটেমটি ক্লিকযোগ্য হতে চান, তাহলে সারিতে থাকা আইটেমগুলিকে প্যারেন্ট ভিউতে যোগ করুন।
▢ সারির একটি আইটেমের জন্য লেআউট ফাইলে এটি যোগ করুন। আপনি যদি আইটেমটিতে একটি একক TextView ক্লিকযোগ্য হতে চান তবে এটিকে <TextView> এ যোগ করুন।
▢ সর্বদা এটি MainActivity জন্য লেআউট ফাইল যোগ করুন।
পরবর্তী পাঠ শুরু করুন:

