expandable listview- customer adapter part

আমরা আগের পর্বেই CustomAdapter নামে জাভা ক্লাস তৈরি করেছিলাম এবং পরিবর্তীতে সেই ক্লাসের অব্জেক্ট তৈরি করে প্যারামিটার হিসেবে কন্টেক্স প্যারেন্ট ডাটা, চাইল্ড ডাটা পাঠিয়েছি । এবার চলুন CustomAdapter টি তৈরি করা যাক । Expandable listview এর এডাপ্টর তৈরি করতে আমরা অন্য ৩টি এডাপ্টর এর সাহায্য নিতে পারি । এগুলো হল -

1 - ExpandableListAdapter
2 -  BaseExpandableListAdapter
3 -  SimpleExpandableListAdapter

তো BaseExpandableListAdapter ব্যাবহার করাই সর্বাপেক্ষা ভালো । সেজন্য CustomAdapter এ BaseExpandableListAdapter ক্লাসটি extends করলাম । extends করলেই এই ক্লাসের abstract ম্যাথডগুলো ইমপ্লিমেন্ট করতে হবে । Alt + Enter চাপার মাধ্যমে সকল ম্যাথডগুলো ইমপ্লিমেন্ট করে নিলাম । মোট ১০ টি ম্যাথড আছে এখানে ।

এবার আমরা অব্জেক্ট এর মাধ্যমে যে প্যারামিটার গুলো এই ক্লাসে পাঠিয়েছিলাম সেগুলো রিসিভ করার জন্য ওই টাইপের ভ্যারিয়েবল গুলো ডিক্লার করবো - Context , ArrayList যেখানে প্যারেন্ট ডাটা আসবে এবং HashMap যেটি প্যারেন্ট ডাটার সাথে চাইল্ড ডাটার সংযোগ স্থাপন করবে ।

ওই ক্লাস থেকে ডাটা এসে এই ভ্যারিয়েবল গুলোয় রিসিভ হবে । এই রিসিভ করার জন্য আমাদের একটি ম্যাথড প্রয়োজন । সেই ম্যাথডের কাজটি আমরা কন্সট্রাকটর এর সাহায্যেই করতে পারি । তাহলে শটকার্ট পদ্ধতিতে কিভাবে কন্সট্রাক্টর তৈরি করতে হয় তা নিশ্চয়ই জানেন । সেটি করে ফেলুন ।

তাহলে আপাতত আমাদের কোডের চেহারা দেখতে যেরকম হবে -

 public class CustomAdapter extends BaseExpandableListAdapter {  
   Context context;  
   ArrayList<String> parent_data;  
   HashMap<String,ArrayList<String>> child_data;  
   public CustomAdapter(Context context, ArrayList<String> parent_data, HashMap<String, ArrayList<String>> child_data) {  
     this.context = context;  
     this.parent_data = parent_data;  
     this.child_data = child_data;  
   }  
   @Override  
   public int getGroupCount() {  
     return 0;  
   }  
   @Override  
   public int getChildrenCount(int groupPosition) {  
     return 0;  
   }  
   @Override  
   public Object getGroup(int groupPosition) {  
     return null;  
   }  
   @Override  
   public Object getChild(int groupPosition, int childPosition) {  
     return null;  
   }  
   @Override  
   public long getGroupId(int groupPosition) {  
     return 0;  
   }  
   @Override  
   public long getChildId(int groupPosition, int childPosition) {  
     return 0;  
   }  
   @Override  
   public boolean hasStableIds() {  
     return false;  
   }  
   @Override  
   public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {  
     return null;  
   }  
   @Override  
   public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {  
     return null;  
   }  
   @Override  
   public boolean isChildSelectable(int groupPosition, int childPosition) {  
     return false;  
   }  
 }  

এবার চলুন কোন ম্যাথড কি কাজ করে সেটি দেখা যাক -

প্রথমেই আছে getGroupCount()  -  Expandable listview তে মোট কতটি আইটেম দেখানো হবে সেটির সাইজ এখানে ডিক্লার করতে হবে । আইটেম বলতে এখানে প্যারেন্ট ডাটাকে বুঝানো হয় । তো চলুন সাইজ ম্যাথডের সাহায্যে এর সাইজটা রিটার্ন করে দেই ।

   @Override  
   public int getGroupCount() {  
     return parent_data.size();  
   }  

এরপর getChildrenCount - এখানে Expandable listview এর মোট চাইল্ড ডাটার সাইজ ডিক্লার করতে হবে । এমনও তো হতে পারে যে কোন প্যারেন্ট ডাটার কোন চাইল্ড ডাটা নাই আবার এমনও হতে পারে কোন প্যারেন্ট আইটেম এ একের অধিক চাইল্ড আছে । সেজন্য যেটা করতে হবে , প্রতি প্যারেন্ট আইটেম এর পজিশনে গিয়ে দেখতে হবে সেখানে মোট কতটি চাইল্ড আছে , এখানে ম্যাথডের সাথেই i নামে একটা প্যারামিটার দেখতে পাচ্ছেন । এটাই হল গ্রুপ পজিশন । parent_data.get(i) দ্বারা প্যারেন্ট ডাটার পজিশন টা নিয়ে তার চাইল্ড সাইজটুকু get এর মাধ্যমে পাঠিয়ে দিয়ে মোট সাইজ রিটার্ন করলাম ।

   @Override  
   public int getChildrenCount(int i) {  
     return child_data.get(parent_data.get(i)).size();  
   }  

getGroup -  এডাপ্টর এর মাধ্যমে এক একটি ভিউ তৈরি করে তা রিটার্ন করা হয় । এজন্য এখানে যখন যে গ্রুপ নিয়ে কাজ করবো সেটি ডিক্লার করে দিবো । সেজন্য প্যারামিটার হিসেবে আসা গ্রুপ পজিশনটা দিয়ে দিলেই হবে ।

   @Override  
   public Object getGroup(int i) {  
     return parent_data.get(i);  
   }  

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

   @Override  
   public Object getChild(int i, int i1) {  
     return child_data.get(parent_data.get(i)).get(i1);  
   }  

getGroupId - এখানে গ্রুপ পজিশন মানে প্যারেন্ট ডাটার পজিশন টা রিটার্ন করতে হবে ।

   @Override  
   public long getGroupId(int i) {  
     return i;  
   }  


getChildId - এখানে চাইল্ড পজিশন টা রিটার্ন করতে হবে ।

   @Override  
   public long getChildId(int i, int i1) {  
     return i1;  
   }  

getGroupView - ম্যাথটি খুবই গুরুত্বপুর্ন । এটির মাধ্যমে আমরা প্যারেন্ট ডাটাগুলোর ভিউ তৈরি করবো ।
প্রথমেই স্ট্রিং ভ্যারিয়েবল তৈরি করে হেডার ডাটা টা নিলাম । getGroup মানেই আমাদের হেডার । সেখান থেকে i দ্বারা পজিশন অনুসারে স্ট্রিং ডাটা গুলো এই ভ্যারিয়েবল এ আসবে । এখন আমরা যে ভিউতে কোন ভিউ দেখাবো প্রথমেই দেখে নিলাম সেটি নাল কিনা । নাল হলে LayoutInflater এর সার্ভিসের সাহায্য নিয়ে parentlayout টি সেই ভিউ তে inflate করে দিলাম । ফলে ওই লেয়াউট এ থাকা সকল ভিউগুলো এবার আমরা এক্সেস করতে পারবো । তাই এবার টেক্সভিউ এর অব্জেক্ট তৈরি করে ভিউ এর ভিতরে থাকা টেক্সভিউ টি ফাইন্ড করে সেটিতে স্ট্রিং ভ্যারিয়েবল এ আসা ভ্যালুটি সেট করে দিলাম । এরপর সেই ভিউটি রিটার্ন করে দিলাম ।

   @Override  
   public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {  
     String parentText = (String) getGroup(i);  
     if (view==null){  
       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
       view= inflater.inflate(R.layout.parentlayout,null);  
     }  
     TextView textView = view.findViewById(R.id.parentText);  
     textView.setText(parentText);  
     return view;  
   }  

getChildView - চাইল্ড ভিউ তৈরি করতেও প্যারেন্ট ভিউ এর মতই সেইম কাজ । এখানে প্রথমে চাইল্ড ডাটা নিতে i টা হল গ্রুপ পজিশন এরপর i1 টা হল চাইল্ড পজিশন এর ডাটা টি স্ট্রিং ভ্যারিয়েবল এ রাখবো । বাকি সবকিছু নিশ্চয়ই নিজেই বুঝতে পারছেন ঠিক getGroupView এর মতই সব কাজ ।

   @Override  
   public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {  
     String childText = (String) getChild(i,i1);  
     if (view==null){  
       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
       view= inflater.inflate(R.layout.childlayout,null);  
     }  
     TextView textView = view.findViewById(R.id.childText);  
     textView.setText(childText);  
     return view;  
   }  

আমাদের কাস্টম এডাপ্টর তৈরি করার কাজ শেষ । এবার আবার MainActivity তে ফিরে যাওয়া যাক । আজকে এই পর্যন্তই থাক । বাকিটা আরেক পর্বে 😊😊😊

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি

Toggle Button - 10 ( Android Bangla Tutorial)

Spinner View - 11 ( Android Bangla Tutorial)

ImageView ( Android Bangla Tutorial - )