এই কোডল্যাবটি অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোর্সের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।
ভূমিকা
আগের কোডল্যাবে, আপনি শিখেছেন কীভাবে একটি ওয়েব পরিষেবা থেকে ডেটা পেতে হয় এবং প্রতিক্রিয়াটিকে ডেটা অবজেক্টে পার্স করতে হয়। এই কোডল্যাবে, আপনি ওয়েব ইউআরএল থেকে ফটো লোড এবং প্রদর্শন করতে সেই জ্ঞানের উপর ভিত্তি করে তৈরি করেন। আপনি কীভাবে একটি RecyclerView তৈরি করবেন তা আবার দেখুন এবং ওভারভিউ পৃষ্ঠায় চিত্রগুলির একটি গ্রিড প্রদর্শন করতে এটি ব্যবহার করুন৷
আপনি ইতিমধ্যে কি জানা উচিত
- কীভাবে টুকরো তৈরি এবং ব্যবহার করবেন।
- ভিউ মডেল, ভিউ মডেল ফ্যাক্টরি, ট্রান্সফর্মেশন এবং
LiveDataসহ আর্কিটেকচারের উপাদানগুলি কীভাবে ব্যবহার করবেন। - কীভাবে একটি REST ওয়েব পরিষেবা থেকে JSON পুনরুদ্ধার করবেন এবং Retrofit এবং Moshi লাইব্রেরি ব্যবহার করে Kotlin অবজেক্টে সেই ডেটা পার্স করবেন।
- কিভাবে একটি
RecyclerViewদিয়ে একটি গ্রিড লেআউট তৈরি করবেন। -
Adapter,ViewHolderএবংDiffUtilকীভাবে কাজ করে।
আপনি কি শিখবেন
- একটি ওয়েব URL থেকে একটি চিত্র লোড এবং প্রদর্শন করতে গ্লাইড লাইব্রেরি কীভাবে ব্যবহার করবেন।
- কিভাবে একটি
RecyclerViewএবং একটি গ্রিড অ্যাডাপ্টার ব্যবহার করে ছবির একটি গ্রিড প্রদর্শন করতে হয়। - ছবিগুলি ডাউনলোড এবং প্রদর্শনের সময় সম্ভাব্য ত্রুটিগুলি কীভাবে পরিচালনা করবেন৷
আপনি কি করবেন
- Mars সম্পত্তি ডেটা থেকে ছবির URL পেতে MarsRealEstate অ্যাপটি পরিবর্তন করুন এবং সেই ছবি লোড ও প্রদর্শন করতে গ্লাইড ব্যবহার করুন।
- অ্যাপটিতে একটি লোডিং অ্যানিমেশন এবং ত্রুটি আইকন যোগ করুন।
- মঙ্গল গ্রহের সম্পত্তি চিত্রগুলির একটি গ্রিড প্রদর্শন করতে একটি
RecyclerViewব্যবহার করুন৷ -
RecyclerViewএ স্থিতি এবং ত্রুটি হ্যান্ডলিং যোগ করুন।
এই কোডল্যাবে (এবং সম্পর্কিত কোডল্যাব), আপনি MarsRealEstate নামে একটি অ্যাপের সাথে কাজ করেন, যা মঙ্গল গ্রহে বিক্রয়ের জন্য সম্পত্তি দেখায়। অ্যাপ্লিকেশানটি সম্পত্তি ডেটা পুনরুদ্ধার এবং প্রদর্শন করার জন্য একটি ইন্টারনেট সার্ভারের সাথে সংযোগ করে, যার মধ্যে মূল্যের মতো বিবরণ এবং সম্পত্তিটি বিক্রয় বা ভাড়ার জন্য উপলব্ধ কিনা। প্রতিটি সম্পত্তির প্রতিনিধিত্বকারী চিত্রগুলি হল মঙ্গল গ্রহের বাস্তব জীবনের ছবি যা NASA-এর মার্স রোভার থেকে ধারণ করা হয়েছে৷

এই কোডল্যাবে আপনি যে অ্যাপটি তৈরি করেন তার সংস্করণটি ওভারভিউ পৃষ্ঠাটি পূরণ করে, যা চিত্রগুলির একটি গ্রিড প্রদর্শন করে। ছবিগুলি সম্পত্তি ডেটার অংশ যা আপনার অ্যাপটি মার্স রিয়েল এস্টেট ওয়েব পরিষেবা থেকে পায়৷ আপনার অ্যাপটি ছবিগুলি লোড করতে এবং প্রদর্শন করতে গ্লাইড লাইব্রেরি এবং চিত্রগুলির জন্য গ্রিড লেআউট তৈরি করতে একটি RecyclerView ব্যবহার করবে৷ আপনার অ্যাপ্লিকেশানটি নেটওয়ার্ক ত্রুটিগুলিও সুন্দরভাবে পরিচালনা করবে৷
একটি ওয়েব URL থেকে একটি ফটো প্রদর্শন করা সোজা মনে হতে পারে, তবে এটিকে ভালভাবে কাজ করার জন্য বেশ কিছু প্রকৌশল রয়েছে৷ ছবিটি ডাউনলোড করতে হবে, বাফার করতে হবে এবং এর সংকুচিত বিন্যাস থেকে একটি ছবিতে ডিকোড করতে হবে যা অ্যান্ড্রয়েড ব্যবহার করতে পারে। ইমেজ একটি ইন-মেমরি ক্যাশে, একটি স্টোরেজ-ভিত্তিক ক্যাশে, বা উভয় ক্যাশে করা উচিত। এই সব কম-অগ্রাধিকার পটভূমি থ্রেডে ঘটতে হবে যাতে UI প্রতিক্রিয়াশীল থাকে। এছাড়াও, সেরা নেটওয়ার্ক এবং CPU পারফরম্যান্সের জন্য, আপনি একবারে একাধিক ছবি আনতে এবং ডিকোড করতে চাইতে পারেন। নেটওয়ার্ক থেকে কীভাবে কার্যকরভাবে ছবি লোড করতে হয় তা শেখা নিজেই একটি কোডল্যাব হতে পারে।
সৌভাগ্যবশত, আপনি আপনার ছবিগুলি ডাউনলোড, বাফার, ডিকোড এবং ক্যাশে করতে গ্লাইড নামে একটি সম্প্রদায়-উন্নত লাইব্রেরি ব্যবহার করতে পারেন৷ গ্লাইড আপনাকে স্ক্র্যাচ থেকে এই সমস্ত কিছু করার চেয়ে অনেক কম কাজ দেয়।
গ্লাইড মূলত দুটি জিনিস প্রয়োজন:
- আপনি যে ছবিটি লোড করতে এবং দেখাতে চান তার URL।
- একটি
ImageViewঅবজেক্ট সেই ছবিটি প্রদর্শন করতে।
এই কাজটিতে, আপনি রিয়েল এস্টেট ওয়েব পরিষেবা থেকে একটি একক চিত্র প্রদর্শন করতে গ্লাইড ব্যবহার করতে শিখবেন। আপনি সেই চিত্রটি প্রদর্শন করেন যা ওয়েব পরিষেবাটি ফেরত দেওয়া বৈশিষ্ট্যগুলির তালিকায় প্রথম মঙ্গল গ্রহের সম্পত্তির প্রতিনিধিত্ব করে। এখানে আগে এবং পরে স্ক্রিনশট আছে:


ধাপ 1: গ্লাইড নির্ভরতা যোগ করুন
- শেষ কোডল্যাব থেকে MarsRealEstate অ্যাপটি খুলুন। (আপনি যদি অ্যাপটি না থাকে তবে আপনি এখানে MarsRealEstateNetwork ডাউনলোড করতে পারেন।)
- এটি কী করে তা দেখতে অ্যাপটি চালান। (এটি একটি সম্পত্তির পাঠ্য বিবরণ প্রদর্শন করে যা অনুমানিকভাবে মঙ্গলে উপলব্ধ।)
- build.gradle খুলুন (মডিউল: অ্যাপ) ।
-
dependenciesবিভাগে, গ্লাইড লাইব্রেরির জন্য এই লাইনটি যোগ করুন:
implementation "com.github.bumptech.glide:glide:$version_glide"
লক্ষ্য করুন যে সংস্করণ নম্বরটি ইতিমধ্যে প্রকল্প গ্রেডল ফাইলে আলাদাভাবে সংজ্ঞায়িত করা হয়েছে।
- নতুন নির্ভরতার সাথে প্রকল্পটি পুনর্নির্মাণ করতে এখন সিঙ্ক এ ক্লিক করুন।
ধাপ 2: ভিউ মডেল আপডেট করুন
এরপর আপনি একটি একক মঙ্গল গ্রহের সম্পত্তির জন্য লাইভ ডেটা অন্তর্ভুক্ত করতে OverviewViewModel ক্লাস আপডেট করেন।
-
overview/OverviewViewModel.ktখুলুন।_responseএর জন্যLiveDataঠিক নীচে, একটিMarsPropertyঅবজেক্টের জন্য অভ্যন্তরীণ (পরিবর্তনযোগ্য) এবং বহিরাগত (অপরিবর্তনীয়) উভয় লাইভ ডেটা যোগ করুন।
অনুরোধ করা হলেMarsPropertyক্লাস (com.example.android.marsrealestate.network.MarsProperty) আমদানি করুন৷
private val _property = MutableLiveData<MarsProperty>()
val property: LiveData<MarsProperty>
get() = _property-
getMarsRealEstateProperties()পদ্ধতিতে,try/catch {}ব্লকের ভিতরের লাইনটি খুঁজুন যেটি বৈশিষ্ট্যের সংখ্যায়_response.valueসেট করে। নীচে দেখানো পরীক্ষা যোগ করুন.MarsPropertyঅবজেক্ট উপলব্ধ থাকলে, এই পরীক্ষাটি_propertyLiveDataএর মানlistResultপ্রথম সম্পত্তিতে সেট করে।
if (listResult.size > 0) {
_property.value = listResult[0]
} সম্পূর্ণ try/catch {} ব্লক এখন এইরকম দেখাচ্ছে:
try {
var listResult = getPropertiesDeferred.await()
_response.value = "Success: ${listResult.size} Mars properties retrieved"
if (listResult.size > 0) {
_property.value = listResult[0]
}
} catch (e: Exception) {
_response.value = "Failure: ${e.message}"
}-
res/layout/fragment_overview.xmlফাইলটি খুলুন।<TextView>উপাদানে,android:textপরিবর্তন করুনLiveDatapropertyimgSrcUrlউপাদানের সাথে আবদ্ধ করতে:
android:text="@{viewModel.property.imgSrcUrl}"- অ্যাপটি চালান।
TextViewপ্রথম মঙ্গল প্রপার্টিতে শুধুমাত্র ছবির URL প্রদর্শন করে। আপনি এখন পর্যন্ত যা করেছেন তা হল ভিউ মডেল এবং সেই URL এর জন্য লাইভ ডেটা সেট আপ করা।

ধাপ 3: একটি বাঁধাই অ্যাডাপ্টার তৈরি করুন এবং গ্লাইড কল করুন
এখন আপনার কাছে প্রদর্শনের জন্য একটি চিত্রের URL আছে এবং সেই চিত্রটি লোড করার জন্য গ্লাইডের সাথে কাজ শুরু করার সময় এসেছে৷ এই ধাপে, আপনি একটি ImageView এর সাথে যুক্ত একটি XML অ্যাট্রিবিউট থেকে URL নিতে একটি বাঁধাই অ্যাডাপ্টার ব্যবহার করেন এবং আপনি চিত্রটি লোড করতে গ্লাইড ব্যবহার করেন৷ বাইন্ডিং অ্যাডাপ্টারগুলি হল এক্সটেনশন পদ্ধতি যা ডেটা পরিবর্তিত হলে কাস্টম আচরণ প্রদান করতে একটি ভিউ এবং আবদ্ধ ডেটার মধ্যে বসে। এই ক্ষেত্রে, কাস্টম আচরণ হল একটি ইউআরএল থেকে একটি ইমেজ ImageView লোড করার জন্য গ্লাইডকে কল করা।
-
BindingAdapters.ktখুলুন। এই ফাইলটি বাইন্ডিং অ্যাডাপ্টারগুলি ধরে রাখবে যা আপনি পুরো অ্যাপ জুড়ে ব্যবহার করেন। - একটি
bindImage()ফাংশন তৈরি করুন যা একটিImageViewএবং একটিStringপরামিতি হিসাবে নেয়।@BindingAdapterদিয়ে ফাংশনটি টীকা করুন।@BindingAdapterটীকাটি ডেটা বাইন্ডিংকে বলে যে আপনি এই বাঁধাই অ্যাডাপ্টারটি কার্যকর করতে চান যখন একটি XML আইটেমেরimageUrlবৈশিষ্ট্য থাকে৷
অনুরোধ করা হলেandroidx.databinding.BindingAdapterএবংandroid.widget.ImageViewআমদানি করুন।
@BindingAdapter("imageUrl")
fun bindImage(imgView: ImageView, imgUrl: String?) {
}-
bindImage()ফাংশনের ভিতরে,imgUrlআর্গুমেন্টের জন্য একটিlet {}ব্লক যোগ করুন:
imgUrl?.let {
}-
let {}ব্লকের ভিতরে, ইউআরএল স্ট্রিং (এক্সএমএল থেকে) একটিUriঅবজেক্টে রূপান্তর করতে নীচে দেখানো লাইন যোগ করুন। অনুরোধ করা হলেandroidx.core.net.toUriআমদানি করুন।
আপনি চূড়ান্তUriঅবজেক্টটি HTTPS স্কিম ব্যবহার করতে চান, কারণ আপনি যে সার্ভার থেকে ছবিগুলি টানছেন তার জন্য সেই স্কিমটি প্রয়োজন৷ HTTPS স্কিম ব্যবহার করতে,toUriবিল্ডারের সাথেbuildUpon.scheme("https")যোগ করুন।toUri()পদ্ধতিটি অ্যান্ড্রয়েড কেটিএক্স কোর লাইব্রেরি থেকে একটি কোটলিন এক্সটেনশন ফাংশন, তাই মনে হচ্ছে এটিStringক্লাসের অংশ।
val imgUri = imgUrl.toUri().buildUpon().scheme("https").build()- এখনও ভিতরে
let {},Uriঅবজেক্ট থেকে ইমেজImageViewলোড করতেGlide.with()কল করুন। অনুরোধ করা হলেcom.bumptech.glide.Glideআমদানি করুন।
Glide.with(imgView.context)
.load(imgUri)
.into(imgView)ধাপ 4: লেআউট এবং টুকরা আপডেট করুন
যদিও গ্লাইড ছবিটি লোড করেছে, এখনও দেখার কিছু নেই। পরবর্তী ধাপ হল ইমেজ প্রদর্শনের জন্য একটি ImageView সহ লেআউট এবং টুকরো আপডেট করা।
-
res/layout/gridview_item.xmlখুলুন। এটি সেই লেআউট রিসোর্স ফাইল যা আপনি কোডল্যাবে পরেRecyclerViewএ প্রতিটি আইটেমের জন্য ব্যবহার করবেন। আপনি শুধুমাত্র একক চিত্র দেখানোর জন্য এখানে অস্থায়ীভাবে এটি ব্যবহার করেন। -
<ImageView>উপাদানের উপরে, ডেটা বাইন্ডিংয়ের জন্য একটি<data>উপাদান যোগ করুন এবংOverviewViewModelক্লাসে আবদ্ধ করুন:
<data>
<variable
name="viewModel"
type="com.example.android.marsrealestate.overview.OverviewViewModel" />
</data>- নতুন ইমেজ লোডিং বাইন্ডিং অ্যাডাপ্টার ব্যবহার করতে
ImageViewউপাদানটিতে একটিapp:imageUrlঅ্যাট্রিবিউট যোগ করুন:
app:imageUrl="@{viewModel.property.imgSrcUrl}"-
overview/OverviewFragment.ktখুলুন।onCreateView()পদ্ধতিতে,FragmentOverviewBindingক্লাসকে স্ফীত করে এবং বাইন্ডিং ভেরিয়েবলে বরাদ্দ করে এমন লাইনটি মন্তব্য করুন। এটা শুধুমাত্র সাময়িক; আপনি পরে এটিতে ফিরে যাবেন।
//val binding = FragmentOverviewBinding.inflate(inflater)- পরিবর্তে
GridViewItemBindingক্লাস স্ফীত করার জন্য একটি লাইন যোগ করুন।com.example.android.marsrealestate. databinding.GridViewItemBindingযখন অনুরোধ করা হয়।
val binding = GridViewItemBinding.inflate(inflater)- অ্যাপটি চালান। এখন আপনি ফলাফল তালিকায় প্রথম
MarsPropertyথেকে ছবির ফটো দেখতে হবে।
ধাপ 5: সাধারণ লোডিং এবং ত্রুটি চিত্র যোগ করুন
গ্লাইড ইমেজ লোড করার সময় একটি প্লেসহোল্ডার ইমেজ এবং লোডিং ব্যর্থ হলে একটি ত্রুটি ইমেজ দেখিয়ে ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে পারে, উদাহরণস্বরূপ যদি ছবিটি অনুপস্থিত বা দূষিত হয়। এই ধাপে, আপনি বাইন্ডিং অ্যাডাপ্টার এবং লেআউটে সেই কার্যকারিতা যোগ করুন।
-
res/drawable/ic_broken_image.xmlখুলুন এবং ডানদিকে প্রিভিউ ট্যাবে ক্লিক করুন। ত্রুটি চিত্রের জন্য, আপনি বিল্ট-ইন আইকন লাইব্রেরিতে উপলব্ধ ভাঙা-চিত্র আইকন ব্যবহার করছেন। এই ভেক্টর অঙ্কনযোগ্য আইকন ধূসর রঙ করতেandroid:tintবৈশিষ্ট্য ব্যবহার করে।

-
res/drawable/loading_animation.xmlখুলুন। এই অঙ্কনযোগ্য একটি অ্যানিমেশন যা<animate-rotate>ট্যাগ দিয়ে সংজ্ঞায়িত করা হয়েছে। অ্যানিমেশনটি কেন্দ্র বিন্দুর চারপাশে আঁকানো যায় এমন একটি চিত্র,loading_img.xmlঘোরায়। (আপনি প্রিভিউতে অ্যানিমেশন দেখতে পাচ্ছেন না।)

-
BindingAdapters.ktফাইলে ফিরে যান।bindImage()পদ্ধতিতে,load()এবংinto()মধ্যেapply()ফাংশন কল করতেGlide.with()এ কল আপডেট করুন। অনুরোধ করা হলেcom.bumptech.glide.request.RequestOptionsআমদানি করুন।
এই কোডটি লোড করার সময় ব্যবহার করার জন্য স্থানধারক লোডিং ইমেজ সেট করে (loading_animationঅঙ্কনযোগ্য)। ইমেজ লোডিং ব্যর্থ হলে কোডটি ব্যবহার করার জন্য একটি ইমেজও সেট করে (broken_imageঅঙ্কনযোগ্য)। সম্পূর্ণbindImage()পদ্ধতি এখন এই মত দেখায়:
@BindingAdapter("imageUrl")
fun bindImage(imgView: ImageView, imgUrl: String?) {
imgUrl?.let {
val imgUri =
imgUrl.toUri().buildUpon().scheme("https").build()
Glide.with(imgView.context)
.load(imgUri)
.apply(RequestOptions()
.placeholder(R.drawable.loading_animation)
.error(R.drawable.ic_broken_image))
.into(imgView)
}
}
- অ্যাপটি চালান। আপনার নেটওয়ার্ক সংযোগের গতির উপর নির্ভর করে, আপনি সংক্ষিপ্তভাবে লোডিং চিত্রটি দেখতে পাবেন যখন গ্লাইড ডাউনলোড করে এবং সম্পত্তি চিত্রটি প্রদর্শন করে। কিন্তু আপনি এখনও ভাঙা-ছবির আইকনটি দেখতে পাবেন না, এমনকি যদি আপনি আপনার নেটওয়ার্ক বন্ধ করে দেন—আপনি কোডল্যাবের শেষ অংশে এটি ঠিক করেন।
আপনার অ্যাপ এখন ইন্টারনেট থেকে সম্পত্তির তথ্য লোড করে। প্রথম MarsProperty তালিকা আইটেম থেকে ডেটা ব্যবহার করে, আপনি ভিউ মডেলে একটি LiveData সম্পত্তি তৈরি করেছেন এবং আপনি একটি ImageView তৈরি করতে সেই সম্পত্তি ডেটা থেকে চিত্র URL ব্যবহার করেছেন। কিন্তু লক্ষ্য হল আপনার অ্যাপের ইমেজের একটি গ্রিড প্রদর্শন করা, তাই আপনি একটি GridLayoutManager সাথে একটি RecyclerView ব্যবহার করতে চান।
ধাপ 1: ভিউ মডেল আপডেট করুন
এই মুহূর্তে ভিউ মডেলটিতে একটি _property LiveData রয়েছে যা একটি MarsProperty অবজেক্ট ধারণ করে - ওয়েব পরিষেবা থেকে প্রতিক্রিয়া তালিকায় প্রথমটি। এই ধাপে, আপনি MarsProperty অবজেক্টের সম্পূর্ণ তালিকা ধরে রাখতে সেই LiveData পরিবর্তন করেন।
-
overview/OverviewViewModel.ktখুলুন। - ব্যক্তিগত
_propertyভেরিয়েবলকে_propertiesএ পরিবর্তন করুন।MarsPropertyঅবজেক্টের একটি তালিকা হতে টাইপ পরিবর্তন করুন।
private val _properties = MutableLiveData<List<MarsProperty>>()- বহিরাগত
propertyলাইভ ডেটাpropertiesসাথে প্রতিস্থাপন করুন। এখানেওLiveDataপ্রকারের তালিকা যোগ করুন:
val properties: LiveData<List<MarsProperty>>
get() = _properties-
getMarsRealEstateProperties()পদ্ধতিতে নিচে স্ক্রোল করুন।try {}ব্লকের ভিতরে, আপনি আগের টাস্কে যে পুরো পরীক্ষাটি যোগ করেছেন তা নীচে দেখানো লাইন দিয়ে প্রতিস্থাপন করুন। যেহেতুlistResultভেরিয়েবলেMarsPropertyঅবজেক্টের একটি তালিকা রয়েছে, আপনি সফল প্রতিক্রিয়ার জন্য পরীক্ষা করার পরিবর্তে এটিকে_properties.valueএ বরাদ্দ করতে পারেন।
_properties.value = listResultসম্পূর্ণ try/catch ব্লক এখন এই মত দেখায়:
try {
var listResult = getPropertiesDeferred.await()
_response.value = "Success: ${listResult.size} Mars properties retrieved"
_properties.value = listResult
} catch (e: Exception) {
_response.value = "Failure: ${e.message}"
}ধাপ 2: লেআউট এবং টুকরা আপডেট করুন
পরবর্তী পদক্ষেপটি হল একক চিত্র দৃশ্যের পরিবর্তে একটি রিসাইক্লার ভিউ এবং একটি গ্রিড লেআউট ব্যবহার করতে অ্যাপের লেআউট এবং টুকরোগুলি পরিবর্তন করা।
-
res/layout/gridview_item.xmlখুলুন।OverviewViewModelথেকেMarsPropertyএ ডেটা বাইন্ডিং পরিবর্তন করুন এবং ভেরিয়েবলের নাম পরিবর্তন করুন"property"।
<variable
name="property"
type="com.example.android.marsrealestate.network.MarsProperty" />-
<ImageView>-এ ,MarsPropertyঅবজেক্টে ছবির URL উল্লেখ করতেapp:imageUrlঅ্যাট্রিবিউট পরিবর্তন করুন:
app:imageUrl="@{property.imgSrcUrl}"-
overview/OverviewFragment.ktখুলুন।onCreateview()এ,FragmentOverviewBindingস্ফীত করে এমন লাইনটি আনকমেন্ট করুন।GridViewBindingস্ফীত করে এমন লাইনটি মুছুন বা মন্তব্য করুন। এই পরিবর্তনগুলি আপনার শেষ টাস্কে করা অস্থায়ী পরিবর্তনগুলিকে পূর্বাবস্থায় ফিরিয়ে আনে।
val binding = FragmentOverviewBinding.inflate(inflater)
// val binding = GridViewItemBinding.inflate(inflater)-
res/layout/fragment_overview.xmlখুলুন। সম্পূর্ণ<TextView>উপাদান মুছুন। - পরিবর্তে এই
<RecyclerView>উপাদানটি যোগ করুন, যা একটি একক আইটেমের জন্য একটিGridLayoutManagerএবংgrid_view_itemলেআউট ব্যবহার করে:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/photos_grid"
android:layout_width="0dp"
android:layout_height="0dp"
android:padding="6dp"
android:clipToPadding="false"
app:layoutManager=
"androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:spanCount="2"
tools:itemCount="16"
tools:listitem="@layout/grid_view_item" />ধাপ 3: ফটো গ্রিড অ্যাডাপ্টার যোগ করুন
এখন fragment_overview লেআউটে একটি RecyclerView আছে যখন grid_view_item লেআউটে একটি একক ImageView রয়েছে। এই ধাপে, আপনি একটি RecyclerView অ্যাডাপ্টারের মাধ্যমে RecyclerView এ ডেটা আবদ্ধ করুন।
-
overview/PhotoGridAdapter.ktখুলুন। - নিচে দেখানো কনস্ট্রাক্টর প্যারামিটার সহ
PhotoGridAdapterক্লাস তৈরি করুন।PhotoGridAdapterক্লাসListAdapterপ্রসারিত করে, যার কন্সট্রাকটরের তালিকা আইটেমের ধরন, ভিউ হোল্ডার এবং একটিDiffUtil.ItemCallbackবাস্তবায়ন প্রয়োজন।
অনুরোধ করা হলেandroidx.recyclerview.widget.ListAdapterএবংcom.example.android.marsrealestate.network.MarsPropertyক্লাস ইমপোর্ট করুন। নিম্নলিখিত ধাপে, আপনি এই কন্সট্রাক্টরের অন্যান্য অনুপস্থিত অংশগুলি বাস্তবায়ন করেন যা ত্রুটি তৈরি করছে।
class PhotoGridAdapter : ListAdapter<MarsProperty,
PhotoGridAdapter.MarsPropertyViewHolder>(DiffCallback) {
}-
PhotoGridAdapterক্লাসের যে কোনো জায়গায় ক্লিক করুন এবংListAdapterপদ্ধতিগুলি বাস্তবায়ন করতেControl+iটিপুন, যাonCreateViewHolder()এবংonBindViewHolder()।
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PhotoGridAdapter.MarsPropertyViewHolder {
TODO("not implemented")
}
override fun onBindViewHolder(holder: PhotoGridAdapter.MarsPropertyViewHolder, position: Int) {
TODO("not implemented")
}-
PhotoGridAdapterশ্রেণীর সংজ্ঞার শেষে, আপনি যে পদ্ধতিগুলি যোগ করেছেন তার পরে, নীচে দেখানো হিসাবেDiffCallbackজন্য একটি সহচর বস্তুর সংজ্ঞা যোগ করুন।
অনুরোধ করা হলেandroidx.recyclerview.widget.DiffUtilআমদানি করুন।
DiffCallbackঅবজেক্টটিDiffUtil.ItemCallbackপ্রসারিত করে আপনি যে ধরনের অবজেক্টের সাথে তুলনা করতে চান—MarsProperty।
companion object DiffCallback : DiffUtil.ItemCallback<MarsProperty>() {
}- এই বস্তুর তুলনামূলক পদ্ধতিগুলি বাস্তবায়ন করতে
Control+iটিপুন, যেগুলি হলareItemsTheSame()এবংareContentsTheSame()।
override fun areItemsTheSame(oldItem: MarsProperty, newItem: MarsProperty): Boolean {
TODO("not implemented")
}
override fun areContentsTheSame(oldItem: MarsProperty, newItem: MarsProperty): Boolean {
TODO("not implemented") }-
areItemsTheSame()পদ্ধতির জন্য, TODO সরান। কোটলিনের রেফারেন্সিয়াল ইকুইলিটি অপারেটর (===) ব্যবহার করুন, যাoldItemএবংnewItemজন্য অবজেক্ট রেফারেন্স একই হলেtrueদেখায়।
override fun areItemsTheSame(oldItem: MarsProperty,
newItem: MarsProperty): Boolean {
return oldItem === newItem
}-
areContentsTheSame()এর জন্য, শুধুমাত্রoldItemএবংnewItemএর আইডিতে স্ট্যান্ডার্ড সমতা অপারেটর ব্যবহার করুন।
override fun areContentsTheSame(oldItem: MarsProperty,
newItem: MarsProperty): Boolean {
return oldItem.id == newItem.id
}- এখনও
PhotoGridAdapterক্লাসের ভিতরে, সঙ্গী বস্তুর নীচে,MarsPropertyViewHolderজন্য একটি অভ্যন্তরীণ শ্রেণীর সংজ্ঞা যোগ করুন, যাRecyclerView.ViewHolderপ্রসারিত করে।
অনুরোধ করা হলেandroidx.recyclerview.widget.RecyclerViewএবংcom.example.android.marsrealestate.databinding.GridViewItemBindingআমদানি করুন।
MarsPropertyলেআউটে আবদ্ধ করার জন্য আপনারGridViewItemBindingভেরিয়েবলের প্রয়োজন, তাই ভেরিয়েবলটিকেMarsPropertyViewHolderএ পাস করুন। কারণ বেসViewHolderক্লাসের কনস্ট্রাক্টরে একটি ভিউ প্রয়োজন, আপনি এটিকে বাইন্ডিং রুট ভিউ পাস করেন।
class MarsPropertyViewHolder(private var binding:
GridViewItemBinding):
RecyclerView.ViewHolder(binding.root) {
}-
MarsPropertyViewHolderএ, একটিbind()পদ্ধতি তৈরি করুন যা একটিMarsPropertyঅবজেক্টকে একটি আর্গুমেন্ট হিসেবে নেয় এবং সেই বস্তুতেbinding.propertyসেট করে। সম্পত্তি সেট করার পরেexecutePendingBindings()কল করুন, যার ফলে আপডেটটি অবিলম্বে কার্যকর হয়।
fun bind(marsProperty: MarsProperty) {
binding.property = marsProperty
binding.executePendingBindings()
}-
onCreateViewHolder()এ, TODO সরিয়ে নিন এবং নীচে দেখানো লাইন যোগ করুন। অনুরোধ করা হলেandroid.view.LayoutInflaterআমদানি করুন।
onCreateViewHolder()পদ্ধতিটিকে একটি নতুনMarsPropertyViewHolderফেরত দিতে হবে, যাGridViewItemBindingস্ফীত করে এবং আপনার মূলViewGroupপ্রসঙ্গ থেকেLayoutInflaterব্যবহার করে তৈরি করা হয়েছে।
return MarsPropertyViewHolder(GridViewItemBinding.inflate(
LayoutInflater.from(parent.context)))onBindViewHolder()পদ্ধতিতে, TODO সরান এবং নীচে দেখানো লাইন যোগ করুন। এখানে আপনিgetItem()কল করুন বর্তমানRecyclerViewঅবস্থানের সাথে যুক্তMarsPropertyঅবজেক্ট পেতে এবং তারপর সেই সম্পত্তিটিকেMarsPropertyViewHolderএbind()পদ্ধতিতে পাস করুন।
val marsProperty = getItem(position)
holder.bind(marsProperty)ধাপ 4: বাইন্ডিং অ্যাডাপ্টার যোগ করুন এবং অংশগুলি সংযুক্ত করুন
অবশেষে, MarsProperty অবজেক্টের তালিকা সহ PhotoGridAdapter আরম্ভ করতে একটি BindingAdapter ব্যবহার করুন। RecyclerView ডেটা সেট করতে একটি BindingAdapter ব্যবহার করলে MarsProperty অবজেক্টের তালিকার জন্য LiveData স্বয়ংক্রিয়ভাবে পর্যবেক্ষণ করতে ডেটা বাইন্ডিং হয়। তারপর বাইন্ডিং অ্যাডাপ্টারটি স্বয়ংক্রিয়ভাবে কল করা হয় যখন MarsProperty তালিকা পরিবর্তন হয়।
-
BindingAdapters.ktখুলুন। - ফাইলের শেষে, একটি
bindRecyclerView()পদ্ধতি যোগ করুন যা একটিRecyclerViewএবংMarsPropertyঅবজেক্টের একটি তালিকা আর্গুমেন্ট হিসেবে নেয়। একটি@BindingAdapterদিয়ে সেই পদ্ধতিটি টীকা করুন।
অনুরোধ করা হলেandroidx.recyclerview.widget.RecyclerViewএবংcom.example.android.marsrealestate.network.MarsPropertyআমদানি করুন।
@BindingAdapter("listData")
fun bindRecyclerView(recyclerView: RecyclerView,
data: List<MarsProperty>?) {
}-
bindRecyclerView()ফাংশনের ভিতরে,recyclerView.adapterকেPhotoGridAdapterএ কাস্ট করুন এবং ডেটা সহadapter.submitList()কল করুন। একটি নতুন তালিকা উপলব্ধ হলে এটিRecyclerViewকে বলে।
অনুরোধ করা হলে com.example.android.marsrealestate.overview.PhotoGridAdapter আমদানি করুন।
val adapter = recyclerView.adapter as PhotoGridAdapter
adapter.submitList(data)-
res/layout/fragment_overview.xmlখুলুন।RecyclerViewএলিমেন্টেapp:listDataঅ্যাট্রিবিউট যোগ করুন এবং ডেটা বাইন্ডিং ব্যবহার করেviewmodel.propertiesএ সেট করুন।
app:listData="@{viewModel.properties}"-
overview/OverviewFragment.ktখুলুন।onCreateView()এ,setHasOptionsMenu()এ কল করার ঠিক আগে, একটি নতুনPhotoGridAdapterঅবজেক্টেbinding.photosGridএRecyclerViewঅ্যাডাপ্টার আরম্ভ করুন।
binding.photosGrid.adapter = PhotoGridAdapter()- অ্যাপটি চালান। আপনি
MarsPropertyইমেজ একটি গ্রিড দেখতে হবে. আপনি যখন নতুন ছবি দেখতে স্ক্রোল করেন, অ্যাপটি নিজেই ছবিটি প্রদর্শন করার আগে লোডিং-প্রগ্রেস আইকন দেখায়। আপনি যদি বিমান মোড চালু করেন, যে ছবিগুলি এখনও লোড হয়নি সেগুলি ভাঙা-ছবি আইকন হিসাবে প্রদর্শিত হবে৷

MarsRealEstate অ্যাপটি ভাঙা-ছবি আইকন প্রদর্শন করে যখন একটি ছবি আনা যায় না। কিন্তু যখন কোন নেটওয়ার্ক নেই, অ্যাপটি একটি ফাঁকা স্ক্রীন দেখায়।

এটি একটি দুর্দান্ত ব্যবহারকারীর অভিজ্ঞতা নয়। এই কাজটিতে, আপনি ব্যবহারকারীকে কী ঘটছে তার একটি ভাল ধারণা দিতে মৌলিক ত্রুটি পরিচালনা যোগ করুন। ইন্টারনেট উপলব্ধ না হলে, অ্যাপটি সংযোগ-ত্রুটি আইকন দেখাবে। অ্যাপটি যখন MarsProperty তালিকা আনছে, অ্যাপটি লোডিং অ্যানিমেশন দেখাবে।
ধাপ 1: ভিউ মডেলে স্ট্যাটাস যোগ করুন
শুরু করতে, আপনি ওয়েব অনুরোধের স্থিতি উপস্থাপন করতে ভিউ মডেলে একটি LiveData তৈরি করুন৷ বিবেচনা করার জন্য তিনটি রাজ্য রয়েছে - লোডিং, সাফল্য এবং ব্যর্থতা। লোডিং অবস্থাটি ঘটে যখন আপনি await() কলে ডেটার জন্য অপেক্ষা করছেন।
-
overview/OverviewViewModel.ktখুলুন। ফাইলের শীর্ষে (আমদানি করার পরে, ক্লাস সংজ্ঞার আগে), সমস্ত উপলব্ধ স্থিতি উপস্থাপন করতে একটিenumযোগ করুন:
enum class MarsApiStatus { LOADING, ERROR, DONE }-
OverviewViewModelক্লাস জুড়ে অভ্যন্তরীণ এবং বাহ্যিক_responseলাইভ ডেটা সংজ্ঞার নাম পরিবর্তন করে_statusকরুন। যেহেতু আপনি এই কোডল্যাবে আগে_propertiesLiveDataজন্য সমর্থন যোগ করেছেন, সম্পূর্ণ ওয়েব পরিষেবা প্রতিক্রিয়া অব্যবহৃত হয়েছে। বর্তমান অবস্থার ট্র্যাক রাখতে আপনার এখানে একটিLiveDataপ্রয়োজন, যাতে আপনি বিদ্যমান ভেরিয়েবলের নাম পরিবর্তন করতে পারেন।
এছাড়াও, String থেকে MarsApiStatus.
private val _status = MutableLiveData<MarsApiStatus>()
val status: LiveData<MarsApiStatus>
get() = _status-
getMarsRealEstateProperties()পদ্ধতিতে স্ক্রোল করুন এবং এখানেও_statusএ_responseআপডেট করুন।"Success"স্ট্রিংটিকেMarsApiStatus.DONEঅবস্থায় এবং"Failure"স্ট্রিংটিকেMarsApiStatus.ERRORএ পরিবর্তন করুন। - একটি
MarsApiStatus.LOADINGস্ট্যাটাস যোগ করুনtry {}ব্লকের উপরে, কল করার আগেawait()। কোরোটিন চলাকালীন এটি প্রাথমিক অবস্থা এবং আপনি ডেটার জন্য অপেক্ষা করছেন। সম্পূর্ণtry/catch {}ব্লক এখন এইরকম দেখাচ্ছে:
try {
_status.value = MarsApiStatus.LOADING
var listResult = getPropertiesDeferred.await()
_status.value = MarsApiStatus.DONE
_properties.value = listResult
} catch (e: Exception) {
_status.value = MarsApiStatus.ERROR
}-
catch {}ব্লকে ত্রুটির অবস্থার পরে,_propertiesLiveDataএকটি খালি তালিকায় সেট করুন। এটিRecyclerViewসাফ করে।
} catch (e: Exception) {
_status.value = MarsApiStatus.ERROR
_properties.value = ArrayList()
}ধাপ 2: স্ট্যাটাস ImageView এর জন্য একটি বাঁধাই অ্যাডাপ্টার যোগ করুন
এখন আপনার ভিউ মডেলে একটি স্ট্যাটাস আছে, কিন্তু এটি শুধুমাত্র রাজ্যের একটি সেট। আপনি কীভাবে এটি অ্যাপে উপস্থিত করবেন? এই ধাপে, আপনি লোডিং এবং ত্রুটির অবস্থার জন্য আইকন প্রদর্শন করতে ডেটা বাইন্ডিংয়ের সাথে সংযুক্ত একটি ImageView ব্যবহার করেন। যখন অ্যাপটি লোডিং অবস্থায় বা ত্রুটির অবস্থায় থাকে, তখন ImageView দৃশ্যমান হওয়া উচিত। অ্যাপটি লোড করা হয়ে গেলে, ImageView অদৃশ্য হওয়া উচিত।
-
BindingAdapters.ktখুলুন।bindStatus()নামে একটি নতুন বাঁধাই অ্যাডাপ্টার যোগ করুন যা আর্গুমেন্ট হিসাবে একটিImageViewএবং একটিMarsApiStatusমান নেয়। অনুরোধ করা হলেcom.example.android.marsrealestate.overview.MarsApiStatusআমদানি করুন।
@BindingAdapter("marsApiStatus")
fun bindStatus(statusImageView: ImageView,
status: MarsApiStatus?) {
}-
bindStatus()পদ্ধতির ভিতরে একটিwhen {}যোগ করুন বিভিন্ন স্ট্যাটাসের মধ্যে পরিবর্তন করতে।
when (status) {
}-
when {}এর ভিতরে, লোডিং অবস্থার জন্য একটি কেস যুক্ত করুন (MarsApiStatus.LOADING)। এই অবস্থার জন্য,ImageViewদৃশ্যমান হিসাবে সেট করুন এবং এটি লোডিং অ্যানিমেশন নির্ধারণ করুন। এটি একই অ্যানিমেশন অঙ্কনযোগ্য যা আপনি আগের টাস্কে গ্লাইডের জন্য ব্যবহার করেছিলেন। অনুরোধ করা হলেandroid.view.Viewআমদানি করুন।
when (status) {
MarsApiStatus.LOADING -> {
statusImageView.visibility = View.VISIBLE
statusImageView.setImageResource(R.drawable.loading_animation)
}
}- ত্রুটি অবস্থার জন্য একটি কেস যোগ করুন, যা
MarsApiStatus.ERROR। একইভাবে আপনিLOADINGঅবস্থার জন্য যা করেছেন, স্ট্যাটাসImageViewদৃশ্যমান হিসাবে সেট করুন এবং সংযোগ-ত্রুটি অঙ্কনযোগ্য পুনরায় ব্যবহার করুন।
MarsApiStatus.ERROR -> {
statusImageView.visibility = View.VISIBLE
statusImageView.setImageResource(R.drawable.ic_connection_error)
}- সম্পন্ন অবস্থার জন্য একটি কেস যোগ করুন, যা
MarsApiStatus.DONE। এখানে আপনার একটি সফল প্রতিক্রিয়া আছে, তাই এটি লুকানোর জন্য স্থিতিImageViewএর দৃশ্যমানতা বন্ধ করুন।
MarsApiStatus.DONE -> {
statusImageView.visibility = View.GONE
}ধাপ 3: লেআউটে স্ট্যাটাস ইমেজভিউ যোগ করুন
-
res/layout/fragment_overview.xmlখুলুন।RecyclerViewউপাদানের নীচে,ConstraintLayoutভিতরে, নীচে দেখানোImageViewযোগ করুন।
এইImageViewRecyclerViewএর মতোই সীমাবদ্ধতা রয়েছে। যাইহোক, প্রস্থ এবং উচ্চতা ভিউ পূরণ করার জন্য চিত্রটিকে প্রসারিত করার পরিবর্তে চিত্রটিকে কেন্দ্রে রাখতেwrap_contentব্যবহার করে। এছাড়াওapp:marsApiStatusঅ্যাট্রিবিউটটি লক্ষ্য করুন, যেখানে ভিউ মডেলে স্ট্যাটাস প্রপার্টি পরিবর্তন হলে আপনারBindingAdapterকল করুন।
<ImageView
android:id="@+id/status_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:marsApiStatus="@{viewModel.status}" />- একটি অনুপস্থিত নেটওয়ার্ক সংযোগ অনুকরণ করতে আপনার এমুলেটর বা ডিভাইসে বিমান মোড চালু করুন। অ্যাপটি কম্পাইল করুন এবং চালান, এবং লক্ষ্য করুন যে ত্রুটি চিত্রটি উপস্থিত হয়েছে:

- অ্যাপটি বন্ধ করতে ব্যাক বোতামে ট্যাপ করুন এবং বিমান মোড বন্ধ করুন। অ্যাপটি ফেরত দিতে সাম্প্রতিক স্ক্রীন ব্যবহার করুন। আপনার নেটওয়ার্ক সংযোগের গতির উপর নির্ভর করে, আপনি একটি অত্যন্ত সংক্ষিপ্ত লোডিং স্পিনার দেখতে পারেন যখন অ্যাপটি ছবিগুলি লোড হতে শুরু করার আগে ওয়েব পরিষেবাটি জিজ্ঞাসা করে।
অ্যান্ড্রয়েড স্টুডিও প্রকল্প: MarsRealEstateGrid
- ছবি পরিচালনার প্রক্রিয়া সহজ করতে, আপনার অ্যাপে ছবি ডাউনলোড, বাফার, ডিকোড এবং ক্যাশে করতে গ্লাইড লাইব্রেরি ব্যবহার করুন।
- ইন্টারনেট থেকে একটি ইমেজ লোড করার জন্য গ্লাইডের দুটি জিনিসের প্রয়োজন: একটি ছবির URL, এবং একটি
ImageViewঅবজেক্ট ইমেজ রাখার জন্য। এই বিকল্পগুলি নির্দিষ্ট করতে, গ্লাইডের সাথেload()এবংinto()পদ্ধতি ব্যবহার করুন। - বাইন্ডিং অ্যাডাপ্টারগুলি হল এক্সটেনশন পদ্ধতি যা একটি ভিউ এবং সেই ভিউ এর আবদ্ধ ডেটার মধ্যে বসে। ডাটা পরিবর্তিত হলে বাইন্ডিং অ্যাডাপ্টারগুলি কাস্টম আচরণ প্রদান করে, উদাহরণস্বরূপ, একটি URL থেকে একটি ইমেজ
ImageViewলোড করতে গ্লাইডকে কল করা। - বাইন্ডিং অ্যাডাপ্টার হল এক্সটেনশন পদ্ধতি যা
@BindingAdapterটীকা দিয়ে টীকা করা হয়। - গ্লাইড অনুরোধে বিকল্প যোগ করতে,
apply()পদ্ধতি ব্যবহার করুন। উদাহরণস্বরূপ, একটি লোডিং অঙ্কনযোগ্য নির্দিষ্ট করতেplaceholder()এর সাথেapply()ব্যবহার করুন এবং অঙ্কনযোগ্য ত্রুটি নির্দিষ্ট করতেerror()এর সাথেapply()ব্যবহার করুন। - ছবিগুলির একটি গ্রিড তৈরি করতে, একটি
GridLayoutManagerসাথে একটিRecyclerViewব্যবহার করুন। - বৈশিষ্ট্যের তালিকা পরিবর্তন করার সময় আপডেট করতে,
RecyclerViewএবং লেআউটের মধ্যে একটি বাঁধাই অ্যাডাপ্টার ব্যবহার করুন।
উদাসীনতা কোর্স:
অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:
অন্যান্য:
এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:
- প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
- শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
- হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.
প্রশিক্ষকরা এই পরামর্শগুলি যতটা কম বা যতটা চান ততটা ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।
আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলিকে নির্দ্বিধায় ব্যবহার করুন৷
এই প্রশ্নগুলোর উত্তর দাও
প্রশ্ন 1
ImageView নির্দেশ করতে আপনি কোন গ্লাইড পদ্ধতি ব্যবহার করেন যাতে লোড করা চিত্র থাকবে?
▢ into()
▢ with()
▢ imageview()
▢ apply()
প্রশ্ন 2
গ্লাইড যখন লোড হচ্ছে তখন দেখানোর জন্য আপনি কীভাবে একটি স্থানধারক চিত্র নির্দিষ্ট করবেন?
▢ একটি অঙ্কনযোগ্য সহ into() পদ্ধতি ব্যবহার করুন।
▢ RequestOptions() ব্যবহার করুন এবং একটি অঙ্কনযোগ্য সহ placeholder() পদ্ধতিতে কল করুন।
▢ Glide.placeholder প্রপার্টিটিকে একটি অঙ্কনযোগ্য করার জন্য বরাদ্দ করুন।
▢ RequestOptions() ব্যবহার করুন এবং loadingImage() পদ্ধতিটিকে একটি অঙ্কনযোগ্য সহ কল করুন।
প্রশ্ন 3
আপনি কিভাবে নির্দেশ করবেন যে একটি পদ্ধতি একটি বাঁধাই অ্যাডাপ্টার?
▢ LiveData এ setBindingAdapter() পদ্ধতিতে কল করুন।
▢ পদ্ধতিটিকে BindingAdapters.kt নামে একটি Kotlin ফাইলে রাখুন।
▢ XML লেআউটে android:adapter অ্যাট্রিবিউট ব্যবহার করুন।
▢ @BindingAdapter দিয়ে পদ্ধতিটি টীকা করুন।
পরবর্তী পাঠ শুরু করুন:
এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, Android Kotlin Fundamentals codelabs ল্যান্ডিং পৃষ্ঠাটি দেখুন।