ভিউতে লেআউট

কম্পোজ পদ্ধতিটি চেষ্টা করুন
অ্যান্ড্রয়েডের জন্য Jetpack Compose হলো প্রস্তাবিত UI টুলকিট। Compose-এ কীভাবে লেআউট নিয়ে কাজ করতে হয় তা শিখুন।

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

চিত্র ১. একটি ভিউ হায়ারার্কির দৃষ্টান্ত, যা একটি UI লেআউট নির্ধারণ করে।

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

আপনি দুইভাবে একটি লেআউট ঘোষণা করতে পারেন:

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

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

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

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

XML লিখুন

অ্যান্ড্রয়েডের 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-এ আপনার লেআউট ঘোষণা করার পর, ফাইলটি আপনার অ্যান্ড্রয়েড প্রজেক্টের res/layout/ ডিরেক্টরিতে .xml এক্সটেনশন দিয়ে সেভ করুন, যাতে এটি সঠিকভাবে কম্পাইল হয়।

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

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

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

কোটলিন

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 চালু হয় Activity তখন অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এর মধ্যে থাকা onCreate() কলব্যাক মেথডটিকে কল করে। অ্যাক্টিভিটির জীবনচক্র সম্পর্কে আরও তথ্যের জন্য, “অ্যাক্টিভিটির পরিচিতি” দেখুন।

বৈশিষ্ট্য

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

আইডি

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

android:id="@+id/my_button"

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

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক আরও অনেক আইডি রিসোর্স প্রদান করে। একটি অ্যান্ড্রয়েড রিসোর্স আইডি উল্লেখ করার সময়, প্লাস চিহ্নের প্রয়োজন নেই, তবে আপনাকে অবশ্যই 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() মেথডে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

    কোটলিন

    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 , কারণ এটি আপনার অ্যাপকে বিভিন্ন ডিভাইসের স্ক্রিনের আকারে সঠিকভাবে প্রদর্শিত হতে সাহায্য করে। গৃহীত পরিমাপের ধরণগুলো Layout resource- এ সংজ্ঞায়িত করা আছে।

লেআউট অবস্থান

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

আপনি 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

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

একটি রৈখিক বিন্যাস তৈরি করুন

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

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

ওয়েব পেজ প্রদর্শন করে।

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

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

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

তালিকা

একটি স্ক্রোলিং একক কলাম তালিকা প্রদর্শন করে।

গ্রিড

কলাম এবং সারির একটি স্ক্রোলিং গ্রিড প্রদর্শন করে।

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

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

আপনি ListView বা GridView মতো একটি AdapterView ডেটা দিয়ে পূর্ণ করতে পারেন AdapterView ইনস্ট্যান্সটিকে একটি Adapter সাথে বাইন্ড করার মাধ্যমে, যা একটি বাহ্যিক উৎস থেকে ডেটা সংগ্রহ করে এবং প্রতিটি ডেটা এন্ট্রির প্রতিনিধিত্বকারী একটি View তৈরি করে।

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

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

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

কোটলিন

    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() কল করুন:

কোটলিন

    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 কোন কলামগুলো চান এবং একটি ইন্টিজার অ্যারে তৈরি করবেন, যেখানে প্রতিটি কলামের জন্য প্রয়োজনীয় সংশ্লিষ্ট ভিউগুলো নির্দিষ্ট করে দেওয়া হবে:

কোটলিন

    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 এবং এই দুটি অ্যারে পাস করুন:

কোটলিন

    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 প্রদত্ত লেআউট ব্যবহার করে Cursor প্রতিটি সারির জন্য একটি ভিউ তৈরি করে, যার জন্য এটি প্রতিটি fromColumns আইটেমকে সংশ্লিষ্ট toViews ভিউ-এর মধ্যে সন্নিবেশ করে।

আপনার অ্যাপ চলার পথে যদি অ্যাডাপ্টার দ্বারা পঠিত মূল ডেটা পরিবর্তিত হয়, তাহলে notifyDataSetChanged() কল করুন। এটি সংযুক্ত ভিউকে ডেটা পরিবর্তনের বিষয়ে অবহিত করে এবং ভিউটি নিজেকে রিফ্রেশ করে নেয়।

ক্লিক ইভেন্টগুলি পরিচালনা করুন

আপনি AdapterView.OnItemClickListener ইন্টারফেসটি ইমপ্লিমেন্ট করার মাধ্যমে AdapterView এর প্রতিটি আইটেমের ক্লিক ইভেন্টে সাড়া দিতে পারেন। উদাহরণস্বরূপ:

কোটলিন

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);

অতিরিক্ত সম্পদ

গিটহাবে থাকা সানফ্লাওয়ার ডেমো অ্যাপে লেআউটগুলো কীভাবে ব্যবহার করা হয় তা দেখুন।