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 যেটি প্যারেন্ট ডাটার সাথে চাইল্ড ডাটার সংযোগ স্থাপন করবে ।
ওই ক্লাস থেকে ডাটা এসে এই ভ্যারিয়েবল গুলোয় রিসিভ হবে । এই রিসিভ করার জন্য আমাদের একটি ম্যাথড প্রয়োজন । সেই ম্যাথডের কাজটি আমরা কন্সট্রাকটর এর সাহায্যেই করতে পারি । তাহলে শটকার্ট পদ্ধতিতে কিভাবে কন্সট্রাক্টর তৈরি করতে হয় তা নিশ্চয়ই জানেন । সেটি করে ফেলুন ।
তাহলে আপাতত আমাদের কোডের চেহারা দেখতে যেরকম হবে -
এবার চলুন কোন ম্যাথড কি কাজ করে সেটি দেখা যাক -
প্রথমেই আছে getGroupCount() - Expandable listview তে মোট কতটি আইটেম দেখানো হবে সেটির সাইজ এখানে ডিক্লার করতে হবে । আইটেম বলতে এখানে প্যারেন্ট ডাটাকে বুঝানো হয় । তো চলুন সাইজ ম্যাথডের সাহায্যে এর সাইজটা রিটার্ন করে দেই ।
এরপর getChildrenCount - এখানে Expandable listview এর মোট চাইল্ড ডাটার সাইজ ডিক্লার করতে হবে । এমনও তো হতে পারে যে কোন প্যারেন্ট ডাটার কোন চাইল্ড ডাটা নাই আবার এমনও হতে পারে কোন প্যারেন্ট আইটেম এ একের অধিক চাইল্ড আছে । সেজন্য যেটা করতে হবে , প্রতি প্যারেন্ট আইটেম এর পজিশনে গিয়ে দেখতে হবে সেখানে মোট কতটি চাইল্ড আছে , এখানে ম্যাথডের সাথেই i নামে একটা প্যারামিটার দেখতে পাচ্ছেন । এটাই হল গ্রুপ পজিশন । parent_data.get(i) দ্বারা প্যারেন্ট ডাটার পজিশন টা নিয়ে তার চাইল্ড সাইজটুকু get এর মাধ্যমে পাঠিয়ে দিয়ে মোট সাইজ রিটার্ন করলাম ।
getGroup - এডাপ্টর এর মাধ্যমে এক একটি ভিউ তৈরি করে তা রিটার্ন করা হয় । এজন্য এখানে যখন যে গ্রুপ নিয়ে কাজ করবো সেটি ডিক্লার করে দিবো । সেজন্য প্যারামিটার হিসেবে আসা গ্রুপ পজিশনটা দিয়ে দিলেই হবে ।
getChild - getGroup এর মতই এখানে চাইল্ড ডাটা ভিউ নিয়ে কাজ করবে । তাই চাইল্ড ডাটার পজিশন টা দিতে হবে । আগেই বলে আসছি কোন প্যারেন্ট এ একের অধিক চাইল্ড ডাটা থাকতে পারে সেজন্য প্যারেন্ট ডাটার পজিশন নিয়ে চাইল্ড ডাটার পজিশন ধরে এগোতে হবে । এখানে প্যারামিটারে i এর মাধ্যমে গ্রুপ পজিশন টা এবং i1 এর মাধ্যমে চাইল্ড পজিশন টা পাই ।
getGroupId - এখানে গ্রুপ পজিশন মানে প্যারেন্ট ডাটার পজিশন টা রিটার্ন করতে হবে ।
getChildId - এখানে চাইল্ড পজিশন টা রিটার্ন করতে হবে ।
getGroupView - ম্যাথটি খুবই গুরুত্বপুর্ন । এটির মাধ্যমে আমরা প্যারেন্ট ডাটাগুলোর ভিউ তৈরি করবো ।
প্রথমেই স্ট্রিং ভ্যারিয়েবল তৈরি করে হেডার ডাটা টা নিলাম । getGroup মানেই আমাদের হেডার । সেখান থেকে i দ্বারা পজিশন অনুসারে স্ট্রিং ডাটা গুলো এই ভ্যারিয়েবল এ আসবে । এখন আমরা যে ভিউতে কোন ভিউ দেখাবো প্রথমেই দেখে নিলাম সেটি নাল কিনা । নাল হলে LayoutInflater এর সার্ভিসের সাহায্য নিয়ে parentlayout টি সেই ভিউ তে inflate করে দিলাম । ফলে ওই লেয়াউট এ থাকা সকল ভিউগুলো এবার আমরা এক্সেস করতে পারবো । তাই এবার টেক্সভিউ এর অব্জেক্ট তৈরি করে ভিউ এর ভিতরে থাকা টেক্সভিউ টি ফাইন্ড করে সেটিতে স্ট্রিং ভ্যারিয়েবল এ আসা ভ্যালুটি সেট করে দিলাম । এরপর সেই ভিউটি রিটার্ন করে দিলাম ।
getChildView - চাইল্ড ভিউ তৈরি করতেও প্যারেন্ট ভিউ এর মতই সেইম কাজ । এখানে প্রথমে চাইল্ড ডাটা নিতে i টা হল গ্রুপ পজিশন এরপর i1 টা হল চাইল্ড পজিশন এর ডাটা টি স্ট্রিং ভ্যারিয়েবল এ রাখবো । বাকি সবকিছু নিশ্চয়ই নিজেই বুঝতে পারছেন ঠিক getGroupView এর মতই সব কাজ ।
আমাদের কাস্টম এডাপ্টর তৈরি করার কাজ শেষ । এবার আবার MainActivity তে ফিরে যাওয়া যাক । আজকে এই পর্যন্তই থাক । বাকিটা আরেক পর্বে 😊😊😊
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 তে ফিরে যাওয়া যাক । আজকে এই পর্যন্তই থাক । বাকিটা আরেক পর্বে 😊😊😊
মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন