ভিউতে লেআউট

Compose-এর মাধ্যমে চেষ্টা করুন
Jetpack Compose হল Android-এর জন্য সাজেস্ট করা UI টুলকিট। Compose-এ লেআউট নিয়ে কীভাবে কাজ করতে হয় তা জানুন।

লেআউট আপনার অ্যাপের ইউজার ইন্টারফেসের স্ট্রাকচার নির্ধারণ করে, যেমন একটি অ্যাক্টিভিটি। লেআউটের সব এলিমেন্ট View এবং ViewGroup অবজেক্টের হায়ারার্কি ব্যবহার করে তৈরি করা হয়। View সাধারণত এমন কিছু আঁকে যা ব্যবহারকারী দেখতে এবং ইন্টার‍্যাক্ট করতে পারেন। ViewGroup হল একটি অদৃশ্য কন্টেনার যা View এবং অন্যান্য ViewGroup অবজেক্টের জন্য লেআউট স্ট্রাকচার নির্ধারণ করে, যেমনটি চিত্র ১-এ দেখানো হয়েছে।

ছবি ১. ভিউ হায়ারার্কির ইলাস্ট্রেশন, যা UI লেআউট সংজ্ঞায়িত করে।

View অবজেক্টকে প্রায়ই উইজেট বলা হয় এবং এটি অনেক সাবক্লাসের মধ্যে একটি হতে পারে, যেমন Button বা TextView। ViewGroup অবজেক্টকে সাধারণত লেআউট বলা হয় এবং এটি বিভিন্ন ধরনের হতে পারে যা আলাদা লেআউট স্ট্রাকচার প্রদান করে, যেমন LinearLayout বা ConstraintLayout।

আপনি দুটি উপায়ে লেআউট ঘোষণা করতে পারেন:

  • XML-এ UI এলিমেন্ট ঘোষণা করুন। Android একটি সহজ XML শব্দভাণ্ডার প্রদান করে যা View ক্লাস এবং সাবক্লাসের সাথে মিলে যায়, যেমন উইজেট এবং লেআউটের জন্য। এছাড়াও, আপনি Android Studio-এর লেআউট এডিটর ব্যবহার করে টেনে নিয়ে রাখুন ইন্টারফেসের মাধ্যমে আপনার XML লেআউট তৈরি করতে পারেন।

  • রানটাইমে লেআউট এলিমেন্ট ইনস্ট্যান্টিয়েট করুন। আপনার অ্যাপ View এবং ViewGroup অবজেক্ট তৈরি করতে পারে এবং প্রোগ্রাম্যাটিক্যালি সেগুলির প্রপার্টি পরিবর্তন করতে পারে।

XML-এ আপনার UI ঘোষণা করলে, আপনি অ্যাপের আচরণ নিয়ন্ত্রণ করে এমন কোড থেকে অ্যাপের প্রেজেন্টেশন আলাদা করতে পারবেন। XML ফাইল ব্যবহার করলে বিভিন্ন স্ক্রিন সাইজ ও ওরিয়েন্টেশনের জন্য আলাদা লেআউট প্রদান করাও সহজ হয়। বিভিন্ন স্ক্রিন সাইজ সাপোর্ট করা লিঙ্কে এই বিষয়ে আরও আলোচনা করা হয়েছে।

Android ফ্রেমওয়ার্ক আপনাকে এই দুটি পদ্ধতির মধ্যে যেকোনও একটি বা দুটিই ব্যবহার করে আপনার অ্যাপের UI তৈরি করার সুবিধা দেয়। যেমন, আপনি XML-এ আপনার অ্যাপের ডিফল্ট লেআউট ঘোষণা করতে পারেন এবং তারপরে রানটাইমে লেআউট পরিবর্তন করতে পারেন।

XML লিখুন

Android-এর XML শব্দভাণ্ডার ব্যবহার করে, আপনি দ্রুত UI লেআউট এবং সেগুলিতে থাকা স্ক্রিন এলিমেন্ট ডিজাইন করতে পারেন, ঠিক যেভাবে আপনি HTML-এ নেস্টেড এলিমেন্টের একটি সিরিজ সহ ওয়েব পেজ তৈরি করেন।

প্রতিটি লেআউট ফাইলে ঠিক একটি রুট এলিমেন্ট থাকতে হবে, যা অবশ্যই একটি View বা ViewGroup অবজেক্ট হতে হবে। রুট এলিমেন্ট নির্ধারণ করার পরে, আপনি অতিরিক্ত লেআউট অবজেক্ট বা উইজেট চাইল্ড এলিমেন্ট হিসেবে যোগ করতে পারবেন যাতে ধীরে ধীরে একটি View হায়ারার্কি তৈরি করা যায় যা আপনার লেআউট নির্ধারণ করে। যেমন, এখানে একটি XML লেআউট দেখানো হয়েছে যা TextView এবং Button রাখার জন্য উল্লম্ব LinearLayout ব্যবহার করে:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button" />
</LinearLayout>

XML-এ আপনার লেআউট ঘোষণা করার পরে, আপনার Android প্রোজেক্টের res/layout/ ডিরেক্টরিতে .xml এক্সটেনশন সহ ফাইলটি সেভ করুন যাতে এটি সঠিকভাবে কম্পাইল হয়।

লেআউট XML ফাইলের সিনট্যাক্স সম্পর্কে আরও জানতে, লেআউট রিসোর্স দেখুন।

XML রিসোর্স লোড করুন

আপনি যখন নিজের অ্যাপ কম্পাইল করেন, তখন প্রতিটি XML লেআউট ফাইল একটি View রিসোর্সে কম্পাইল করা হয়। আপনার অ্যাপের Activity.onCreate() কলব্যাক ইমপ্লিমেন্টেশনে লেআউট রিসোর্স লোড করুন। এটি করতে setContentView() কল করুন, এই ফর্ম্যাটে আপনার লেআউট রিসোর্সের রেফারেন্স পাস করুন: R.layout.layout_file_name। যেমন, আপনার XML লেআউট main_layout.xml হিসেবে সেভ করা থাকলে, Activity-এর জন্য এটি এইভাবে লোড করুন:

Kotlin

fun onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_layout)
}

জাভা

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}

Activity চালু হলে Android ফ্রেমওয়ার্ক আপনার Activity-এ onCreate() কলব্যাক মেথড কল করে। অ্যাক্টিভিটি লাইফসাইকেল সম্পর্কে আরও জানতে, অ্যাক্টিভিটির ভূমিকা দেখুন।

অ্যাট্রিবিউট

প্রতিটি View এবং ViewGroup অবজেক্টে নিজস্ব বিভিন্ন ধরনের XML অ্যাট্রিবিউট কাজ করে। কিছু অ্যাট্রিবিউট নির্দিষ্ট View অবজেক্টের জন্য প্রযোজ্য। যেমন, TextView-এ textSize অ্যাট্রিবিউট কাজ করে। তবে, এই অ্যাট্রিবিউটগুলি যেকোনও View অবজেক্টের মাধ্যমেও উত্তরাধিকার সূত্রে প্রাপ্ত হয় যা এই ক্লাসকে প্রসারিত করে। কিছু সব View অবজেক্টের জন্য সাধারণ, কারণ সেগুলি রুট View ক্লাস থেকে ইনহেরিট করা হয়, যেমন id অ্যাট্রিবিউট। অন্যান্য অ্যাট্রিবিউটকে লেআউট প্যারামিটার হিসেবে বিবেচনা করা হয়, যা View অবজেক্টের নির্দিষ্ট লেআউট ওরিয়েন্টেশন বর্ণনা করে, যেমনটি সেই অবজেক্টের মূল ViewGroup অবজেক্ট দ্বারা সংজ্ঞায়িত করা হয়েছে।

আইডি

ট্রি-এর মধ্যে View-কে অনন্যভাবে শনাক্ত করতে, যেকোনও View অবজেক্টের সাথে একটি পূর্ণসংখ্যা আইডি যুক্ত থাকতে পারে। অ্যাপ কম্পাইল করার সময়, এই আইডিকে পূর্ণসংখ্যা হিসেবে রেফারেন্স করা হয়, তবে আইডি সাধারণত লেআউট XML ফাইলে id অ্যাট্রিবিউটে স্ট্রিং হিসেবে অ্যাসাইন করা হয়। এটি হল একটি XML অ্যাট্রিবিউট যা সব View অবজেক্টের ক্ষেত্রে প্রযোজ্য এবং এটি View ক্লাসের মাধ্যমে সংজ্ঞায়িত করা হয়। আপনি এটি প্রায়ই ব্যবহার করেন। XML ট্যাগের মধ্যে আইডির সিনট্যাক্স নিম্নলিখিতভাবে লিখতে হয়:

android:id="@+id/my_button"

স্ট্রিংয়ের শুরুতে at চিহ্ন (@) থাকলে বোঝা যায় যে XML পার্সার আইডি স্ট্রিংয়ের বাকি অংশ পার্স ও এক্সপ্যান্ড করে এবং এটিকে আইডি রিসোর্স হিসেবে শনাক্ত করে। প্লাস চিহ্ন (+) মানে হল এটি একটি নতুন রিসোর্সের নাম যা অবশ্যই তৈরি করতে হবে এবং R.java ফাইলে আপনার রিসোর্সে যোগ করতে হবে।

Android ফ্রেমওয়ার্ক আরও অনেক আইডি রিসোর্স অফার করে। Android রিসোর্স আইডি রেফারেন্স করার সময়, আপনাকে প্লাস চিহ্ন ব্যবহার করতে হবে না, তবে আপনাকে অবশ্যই নিম্নলিখিতভাবে android প্যাকেজ নেমস্পেস যোগ করতে হবে:

android:id="@android:id/empty"

android প্যাকেজ নেমস্পেস থেকে বোঝা যায় যে আপনি লোকাল রিসোর্স ক্লাসের পরিবর্তে android.R রিসোর্স ক্লাস থেকে একটি আইডি রেফার করছেন।

ভিউ তৈরি করতে এবং আপনার অ্যাপ থেকে সেগুলিকে রেফারেন্স করতে, আপনি নিম্নলিখিত সাধারণ প্যাটার্ন ব্যবহার করতে পারেন:

  1. লেআউট ফাইলে একটি ভিউ নির্ধারণ করুন এবং এটিকে একটি অনন্য আইডি অ্যাসাইন করুন, যেমন নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
    <Button android:id="@+id/my_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/my_button_text"/>
  2. ভিউ অবজেক্টের একটি ইনস্ট্যান্স তৈরি করুন এবং লেআউট থেকে এটি ক্যাপচার করুন, সাধারণত onCreate() পদ্ধতিতে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

    Kotlin

    val myButton: Button = findViewById(R.id.my_button)

    জাভা

    Button myButton = (Button) findViewById(R.id.my_button);

RelativeLayout তৈরি করার সময় ভিউ অবজেক্টের জন্য আইডি নির্ধারণ করা গুরুত্বপূর্ণ। রিলেটিভ লেআউটে, সিবলিং ভিউ অন্য সিবলিং ভিউয়ের সাপেক্ষে নিজের লেআউট নির্ধারণ করতে পারে, যা অনন্য আইডি দ্বারা রেফারেন্স করা হয়।

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

লেআউট প্যারামিটার

layout_something নামের XML লেআউট অ্যাট্রিবিউট View-এর জন্য লেআউট প্যারামিটার নির্ধারণ করে যা ViewGroup-এর জন্য উপযুক্ত যেখানে এটি থাকে।

প্রতিটি ViewGroup ক্লাস একটি নেস্টেড ক্লাস প্রয়োগ করে যা ViewGroup.LayoutParams-কে প্রসারিত করে। এই সাবক্লাসে প্রপার্টির ধরন থাকে যা প্রতিটি চাইল্ড ভিউয়ের সাইজ ও পজিশন নির্ধারণ করে, ভিউ গ্রুপের জন্য উপযুক্ত হিসেবে। ছবি ২-এ যেমন দেখানো হয়েছে, পেরেন্ট ভিউ গ্রুপ প্রতিটি চাইল্ড ভিউয়ের জন্য লেআউট প্যারামিটার নির্ধারণ করে, যার মধ্যে চাইল্ড ভিউ গ্রুপও অন্তর্ভুক্ত।

ছবি ২. প্রতিটি ভিউয়ের সাথে সংশ্লিষ্ট লেআউট প্যারামিটার সহ ভিউ হায়ারার্কির ভিজ্যুয়ালাইজেশন।

প্রতিটি LayoutParams সাবক্লাসের ভ্যালু সেট করার জন্য নিজস্ব সিনট্যাক্স আছে। প্রতিটি চাইল্ড এলিমেন্টকে অবশ্যই একটি LayoutParams সংজ্ঞায়িত করতে হবে যা তার পেরেন্টের জন্য উপযুক্ত, যদিও এটি নিজের চাইল্ডের জন্য একটি ভিন্ন LayoutParams সংজ্ঞায়িত করতে পারে।

সব ভিউ গ্রুপে layout_width ও layout_height ব্যবহার করে প্রস্থ ও উচ্চতা অন্তর্ভুক্ত থাকে এবং প্রতিটি ভিউতে এগুলি উল্লেখ করতে হয়। অনেক LayoutParams-এ ঐচ্ছিক মার্জিন ও বর্ডার থাকে।

আপনি সঠিক পরিমাপ সহ প্রস্থ এবং উচ্চতা নির্দিষ্ট করতে পারেন, তবে আপনি প্রায়শই এটি করতে নাও চাইতে পারেন। প্রায়শই, আপনি প্রস্থ বা উচ্চতা সেট করতে এইসব কনস্ট্যান্টের মধ্যে একটি ব্যবহার করেন:

  • wrap_content: আপনার ভিউকে বলে যে কন্টেন্টের জন্য প্রয়োজনীয় ডাইমেনশন অনুযায়ী সাইজ সেট করতে।
  • match_parent: আপনার ভিউকে বলে যে এটি যেন পেরেন্ট ভিউ গ্রুপের অনুমোদিত সাইজের মতো বড় হয়।

সাধারণত, আমরা পিক্সেলের মতো অ্যাবসোলিউট ইউনিট ব্যবহার করে লেআউটের প্রস্থ ও উচ্চতা নির্দিষ্ট করতে সাজেস্ট করি না। একটি ভালো পদ্ধতি হল আপেক্ষিক পরিমাপ ব্যবহার করা, যেমন ঘনত্ব-নিরপেক্ষ পিক্সেল ইউনিট (dp), wrap_content, বা match_parent, কারণ এটি আপনার অ্যাপকে বিভিন্ন ডিভাইসের স্ক্রিন সাইজ জুড়ে সঠিকভাবে ডিসপ্লে করতে সাহায্য করে। গ্রহণযোগ্য পরিমাপের ধরন লেআউট রিসোর্সে নির্দিষ্ট করা আছে।

লেআউট পজিশন

একটি ভিউতে আয়তাকার জ্যামিতি আছে। এটির একটি লোকেশন আছে, যা বাঁদিক এবং উপর স্থানাঙ্কের একটি জোড়া হিসাবে প্রকাশ করা হয় এবং দুটি মাত্রা, যা প্রস্থ এবং উচ্চতা হিসাবে প্রকাশ করা হয়। লোকেশন ও ডাইমেনশনের ইউনিট হল পিক্সেল।

আপনি getLeft() এবং getTop() মেথড কল করে কোনও ভিউয়ের লোকেশন রিট্রিভ করতে পারবেন। প্রথমটি ভিউকে উপস্থাপনকারী আয়তক্ষেত্রের বাঁদিকের (x) কোঅর্ডিনেট ফেরত পাঠায়। পরেরটি ভিউকে উপস্থাপনকারী আয়তক্ষেত্রের উপরের (y) কোঅর্ডিনেট ফেরত পাঠায়। এইসব পদ্ধতি প্যারেন্ট ভিউয়ের সাপেক্ষে ভিউয়ের লোকেশন ফেরত দেয়। যেমন, getLeft()-এর মান ২০ হলে, এর অর্থ হল ভিউটি তার ডাইরেক্ট পেরেন্টের বাঁদিকের প্রান্ত থেকে ২০ পিক্সেল ডানদিকে অবস্থিত।

এছাড়াও, অপ্রয়োজনীয় গণনা এড়ানোর জন্য সুবিধাজনক পদ্ধতি আছে: যেমন getRight() এবং getBottom()। এই পদ্ধতিগুলি ভিউকে উপস্থাপনকারী আয়তক্ষেত্রের ডান ও নিচের প্রান্তের কোঅর্ডিনেট রিটার্ন করে। যেমন, getRight() কল করা নিম্নলিখিত কম্পিউটেশনের মতো: getLeft() + getWidth()।

সাইজ, প্যাডিং ও মার্জিন

ভিউয়ের সাইজ প্রস্থ ও উচ্চতা দিয়ে প্রকাশ করা হয়। একটি ভিউতে প্রস্থ ও দৈর্ঘ্যের দুটি জোড়া ভ্যালু থাকে।

প্রথম জোড়াকে পরিমাপ করা প্রস্থ এবং পরিমাপ করা উচ্চতা বলা হয়। এইসব ডাইমেনশন নির্ধারণ করে যে কোনও ভিউ তার পেরেন্টের মধ্যে কত বড় হতে চায়। আপনি getMeasuredWidth() এবং getMeasuredHeight()-এ কল করে পরিমাপ করা ডাইমেনশন পেতে পারেন।

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

ডাইমেনশন পরিমাপ করার জন্য, ভিউতে প্যাডিং বিবেচনা করা হয়। প্যাডিং ভিউয়ের বাঁদিক, উপর, ডানদিক ও নিচের অংশের জন্য পিক্সেলে প্রকাশ করা হয়। নির্দিষ্ট সংখ্যক পিক্সেল দ্বারা ভিউয়ের কন্টেন্ট অফসেট করতে আপনি প্যাডিং ব্যবহার করতে পারেন। যেমন, দুই পিক্সেলের বাঁদিকের প্যাডিং ভিউয়ের কন্টেন্টকে বাঁদিকের প্রান্ত থেকে ডানদিকে দুই পিক্সেল সরিয়ে দেয়। আপনি setPadding(int, int, int, int) পদ্ধতি ব্যবহার করে প্যাডিং সেট করতে পারেন এবং getPaddingLeft(), getPaddingTop(), getPaddingRight(), এবং getPaddingBottom() কল করে এটি কোয়েরি করতে পারেন।

যদিও একটি ভিউ প্যাডিং নির্ধারণ করতে পারে, তবে এটি মার্জিন সমর্থন করে না। তবে, ভিউ গ্রুপে মার্জিন কাজ করে। আরও তথ্যের জন্য ViewGroup এবং ViewGroup.MarginLayoutParams দেখুন।

ডাইমেনশন সম্পর্কে আরও জানতে, ডাইমেনশন দেখুন।

প্রোগ্রাম্যাটিক্যালি মার্জিন ও প্যাডিং সেট করার পাশাপাশি, আপনি সেগুলি আপনার XML লেআউটেও সেট করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >
      <TextView android:id="@+id/text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="16dp"
                android:padding="8dp"
                android:text="Hello, I am a TextView" />
      <Button android:id="@+id/button"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginTop="16dp"
              android:paddingBottom="4dp"
              android:paddingEnd="8dp"
              android:paddingStart="8dp"
              android:paddingTop="4dp"
              android:text="Hello, I am a Button" />
  </LinearLayout>
  

আগের উদাহরণে মার্জিন ও প্যাডিং প্রয়োগ করা হয়েছে। TextView-এ সবদিকে একই মার্জিন ও প্যাডিং প্রয়োগ করা হয়েছে এবং Button-এ দেখানো হয়েছে যে আপনি কীভাবে বিভিন্ন প্রান্তে আলাদা আলাদাভাবে সেগুলি প্রয়োগ করতে পারেন।

সাধারণ লেআউট

ViewGroup ক্লাসের প্রতিটি সাবক্লাস, এর মধ্যে নেস্ট করা ভিউ দেখানোর অনন্য উপায় প্রদান করে। সবচেয়ে নমনীয় লেআউটের ধরন এবং যেটি আপনার লেআউট হায়ারার্কি অগভীর রাখার জন্য সেরা টুল প্রদান করে, সেটি হল ConstraintLayout।

Android প্ল্যাটফর্মে তৈরি কিছু সাধারণ লেআউটের ধরন নিচে উল্লেখ করা হল।

লিনিয়ার লেআউট তৈরি করা

এর চাইল্ডকে একটি অনুভূমিক বা উল্লম্ব সারিতে সাজায় এবং উইন্ডোর দৈর্ঘ্য স্ক্রিনের দৈর্ঘ্যকে ছাড়িয়ে গেলে একটি স্ক্রলবার তৈরি করে।

WebView-এ ওয়েব অ্যাপ তৈরি করা

ওয়েব পেজ দেখায়।

ডায়নামিক তালিকা তৈরি করা

আপনার লেআউটের কন্টেন্ট ডায়নামিক হলে বা আগে থেকে নির্ধারিত না থাকলে, আপনি RecyclerView বা AdapterView-এর সাবক্লাস ব্যবহার করতে পারবেন। RecyclerView সাধারণত আরও ভালো বিকল্প, কারণ এটি AdapterView-এর চেয়ে আরও দক্ষতার সাথে মেমরি ব্যবহার করে।

RecyclerView এবং AdapterView-এর মাধ্যমে যেসব সাধারণ লেআউট তৈরি করা যায়, সেগুলি হল:

তালিকা

স্ক্রল করা যায় এমন একটি কলামের তালিকা দেখায়।

গ্রিড

কলাম ও সারির স্ক্রল করা যায় এমন গ্রিড দেখায়।

RecyclerView আরও অনেক সম্ভাবনা এবং কাস্টম লে-আউট ম্যানেজার তৈরি করার বিকল্প অফার করে।

ডেটা দিয়ে অ্যাডাপ্টার ভিউ পূরণ করা

আপনি AdapterView ইনস্ট্যান্সকে Adapter-এর সাথে বাইন্ড করে AdapterView যেমন ListView বা GridView পপুলেট করতে পারেন, যা এক্সটার্নাল সোর্স থেকে ডেটা নিয়ে আসে এবং প্রতিটি ডেটা এন্ট্রিকে দেখায় এমন একটি View তৈরি করে।

Android, Adapter-এর একাধিক সাবক্লাস প্রদান করে যা বিভিন্ন ধরনের ডেটা ফিরিয়ে আনতে এবং AdapterView-এর জন্য ভিউ তৈরি করতে উপযোগী। সবচেয়ে সাধারণ দুটি অ্যাডাপ্টর হল:

ArrayAdapter
আপনার ডেটা সোর্স অ্যারে হলে এই অ্যাডাপ্টার ব্যবহার করুন। ডিফল্ট হিসেবে, ArrayAdapter প্রতিটি আইটেমে toString() কল করে এবং TextView-এ কন্টেন্ট রেখে প্রতিটি অ্যারে আইটেমের জন্য একটি ভিউ তৈরি করে।

যেমন, আপনার কাছে স্ট্রিংয়ের অ্যারে থাকলে এবং আপনি সেটি ListView-এ দেখাতে চাইলে, প্রতিটি স্ট্রিং ও স্ট্রিং অ্যারের লেআউট নির্দিষ্ট করতে কনস্ট্রাক্টর ব্যবহার করে নতুন ArrayAdapter শুরু করুন:

Kotlin

    val adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray)
    

জাভা

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, myStringArray);
    

এই কনস্ট্রাক্টরের আর্গুমেন্টগুলি হল:

  • আপনার অ্যাপ Context
  • লেআউট যাতে অ্যারের প্রতিটি স্ট্রিংয়ের জন্য একটি TextView থাকে
  • স্ট্রিং অ্যারে

তারপর আপনার ListView-এ setAdapter()-কে কল করুন:

Kotlin

    val listView: ListView = findViewById(R.id.listview)
    listView.adapter = adapter
    

জাভা

    ListView listView = (ListView) findViewById(R.id.listview);
    listView.setAdapter(adapter);
    

প্রতিটি আইটেমের উপস্থিতি কাস্টমাইজ করতে, আপনি অ্যারেতে থাকা অবজেক্টের জন্য toString() মেথড ওভাররাইড করতে পারবেন। অথবা, প্রতিটি আইটেমের জন্য এমন একটি ভিউ তৈরি করতে যা TextView ছাড়া অন্য কিছু—যেমন, আপনি যদি প্রতিটি অ্যারে আইটেমের জন্য ImageView চান—তাহলে ArrayAdapter ক্লাস এক্সটেন্ড করুন এবং getView() ওভাররাইড করুন যাতে প্রতিটি আইটেমের জন্য আপনি যে ধরনের ভিউ চান তা রিটার্ন করা যায়।

SimpleCursorAdapter
আপনার ডেটা Cursor থেকে এলে এই অ্যাডাপ্টার ব্যবহার করুন। SimpleCursorAdapter ব্যবহার করার সময়, Cursor-এর প্রতিটি সারির জন্য ব্যবহার করার লেআউট এবং Cursor-এর কোন কলাম আপনি যে লেআউট চান তার ভিউতে যোগ করতে চান তা নির্দিষ্ট করুন। যেমন, আপনি যদি লোকজনের নাম ও ফোন নম্বরের তালিকা তৈরি করতে চান, তাহলে এমন একটি কোয়েরি করতে পারেন যা Cursor প্রদান করে, যেখানে প্রতিটি ব্যক্তির জন্য একটি করে সারি এবং নাম ও নম্বরের জন্য কলাম থাকে। আপনি তারপরে একটি স্ট্রিং অ্যারে তৈরি করেন যা প্রতিটি ফলাফলের জন্য লেআউটে আপনি Cursor-এর কোন কলাম চান তা নির্দিষ্ট করে এবং একটি পূর্ণসংখ্যা অ্যারে যা প্রতিটি কলামের জন্য সংশ্লিষ্ট ভিউ নির্দিষ্ট করে রাখতে হবে:

Kotlin

    val fromColumns = arrayOf(ContactsContract.Data.DISPLAY_NAME,
                              ContactsContract.CommonDataKinds.Phone.NUMBER)
    val toViews = intArrayOf(R.id.display_name, R.id.phone_number)
    

জাভা

    String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,
                            ContactsContract.CommonDataKinds.Phone.NUMBER};
    int[] toViews = {R.id.display_name, R.id.phone_number};
    

আপনি SimpleCursorAdapter ইনস্ট্যান্টিয়েট করার সময়, প্রতিটি ফলাফলের জন্য ব্যবহার করার লেআউট, ফলাফল সহ Cursor এবং এই দুটি অ্যারে পাস করুন:

Kotlin

    val adapter = SimpleCursorAdapter(this,
            R.layout.person_name_and_number, cursor, fromColumns, toViews, 0)
    val listView = getListView()
    listView.adapter = adapter
    

জাভা

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
    ListView listView = getListView();
    listView.setAdapter(adapter);
    

SimpleCursorAdapter তারপর প্রতিটি fromColumns আইটেমকে সংশ্লিষ্ট toViews ভিউতে যোগ করে, প্রদত্ত লেআউট ব্যবহার করে Cursor-এর প্রতিটি সারির জন্য একটি ভিউ তৈরি করে।

আপনার অ্যাপের লাইফ সাইকেল চলাকালীন, আপনার অ্যাডাপ্টার যে ডেটা পড়ে, আপনি যদি সেই ডেটা পরিবর্তন করেন, তাহলে notifyDataSetChanged() কল করুন। এটি অ্যাটাচ করা ভিউকে বিজ্ঞপ্তি দেয় যে ডেটা পরিবর্তন করা হয়েছে এবং এটি নিজেকে রিফ্রেশ করে।

ক্লিক ইভেন্ট ম্যানেজ করা

আপনি AdapterView.OnItemClickListener ইন্টারফেস প্রয়োগ করে AdapterView-এর প্রতিটি আইটেমে ক্লিক ইভেন্টের উত্তর দিতে পারবেন। যেমন:

Kotlin

listView.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
    // Do something in response to the click.
}

জাভা

// Create a message handling object as an anonymous class.
private OnItemClickListener messageClickedHandler = new OnItemClickListener() {
    public void onItemClick(AdapterView parent, View v, int position, long id) {
        // Do something in response to the click.
    }
};

listView.setOnItemClickListener(messageClickedHandler);

অতিরিক্ত রিসোর্স

GitHub-এ Sunflower ডেমো অ্যাপে কীভাবে লেআউট ব্যবহার করা হয় তা দেখুন।