লিস্টভিউতে চেকবক্স যুক্ত করা অনেক সহজ। অ্যান্ড্রয়েড লিস্ট ভিউ – Android ListView লেখাটিতে আমরা দেখেছি কিভাবে লিস্ট ভিউ নিয়ে কাজ করা যায়। এ ছাড়া অবজেক্ট লিস্ট থেকে লিস্টভিউ ও কাস্টম অ্যাডাপ্টার লেখাটিতে জানা যাবে কিভাবে অবজেক্ট লিস্ট থেকে লিস্টভিউ তৈরি করা যায়। এ টিউটোরিয়ালে দেখব কিভাবে লিস্ট ভিউতে চেকবক্স যুক্ত করা যায়। কোন লিস্টের কোন কোন আইটেম সিলেক্ট হয়েছে, তা বের করা যায়। আমাদের অ্যাপ দেখতে নিচের মত হবেঃ
আমাদের মেইন লেয়াউট ফাইলে থাকবে একটা বাটন এবং একটা লিস্ট ভিউ। বাটনের কাজ হচ্ছে কোন কোন আইটেম গুলো চেক করা রয়েছে, সেগুলো বের করাঃ
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="me.jakir.checkboxwithlistview.MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="8dp" android:text="Checked items" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" /> <ListView android:id="@+id/list_view" android:layout_width="0dp" android:layout_height="439dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="9dp" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/button" /> </android.support.constraint.ConstraintLayout>
লিস্টভিউর আইটেমের জন্য লেয়াউট, যেখানে একটা চেকবক্স এবং একটা টেক্সট ভিউ রয়েছেঃ
<?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="wrap_content"> <CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" android:focusableInTouchMode="false" /> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp" android:text="Title"> </TextView> </LinearLayout>
যেমন আমরা একটা শপিং লিস্ট অ্যাপ তৈরি করব। তার জন্য শপিংলিস্ট POJO ক্লাস তৈরি করে নিতে হবেঃ
লিস্ট ভিউ তৈরি করার জন্য আমাদের দরকার হবে, ShoppingList.java
public class ShoppingList { String title; boolean status; public ShoppingList(String title, boolean status) { this.title = title; this.status = status; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } }
আমরা যদি অ্যারে নিয়ে কাজ করতাম, তাহলে লিস্টভিউ এর জন্য অ্যারে এডাপ্টার দিয়েই কাজ হত। কিন্তু আমরা এখন কাজ করব অবজেক্ট লিস্ট নিয়ে। তাই আমাদের নিজস্ব এডাপ্টার তৈরি করে নিতে হবে। ShoppingListAdapter:
import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.TextView; import java.util.ArrayList; public class ShoppingListAdapter extends ArrayAdapter<ShoppingList> { private ArrayList<ShoppingList> shoppingLists; public ShoppingListAdapter(Context context, int iewResourceId, ArrayList<ShoppingList> shoppingLists) { super(context, iewResourceId, shoppingLists); this.shoppingLists = new ArrayList<ShoppingList>(); this.shoppingLists.addAll(shoppingLists); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { LayoutInflater vi = ((Activity) getContext()).getLayoutInflater(); convertView = vi.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.status = (CheckBox) convertView.findViewById(R.id.checkbox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } ShoppingList shoppingList = shoppingLists.get(position); holder.title.setText(shoppingList.getTitle()); holder.status.setChecked(shoppingList.isStatus()); return convertView; } private class ViewHolder { TextView title; CheckBox status; } }
আমাদের অ্যাপের মেইন এক্টিভিটিতে প্রথমে আমরা একটা ডামি শপিং লিস্ট তৈরি করে নিব। তারপর আমাদের অ্যাডেপ্টারে এই লিস্টটা পাস করে দিব। কোন ভিউতে লিস্টটা দেখাতে হবে, তা বলে দেওয়ার পর আমাদের শপিং লিস্ট দেখাবেঃ
private void populateListView() { ShoppingList shopping1 = new ShoppingList("Buy Coffee", false); shoppingLists.add(shopping1); ShoppingList shopping2 = new ShoppingList("Buy Milk", true); shoppingLists.add(shopping2); adapter = new ShoppingListAdapter(this, R.layout.list_item, shoppingLists); list = (ListView) findViewById(R.id.list_view); list.setAdapter(adapter); }
এরপর আমরা চাইলে যে কোন আইটেম চেক করতে পারব, আবার আনচেক ও করতে পারব। এখানে কোন আইটেমে ক্লিক করার পর ঐ আটেমটা চেক করা থাকলে আনচেক হয়ে যাবে। আবার আনচেক করা থাকলে চেক হবে। তা করতে পারি এভাবেঃ
list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckBox cb = (CheckBox) view.findViewById(R.id.checkbox); cb.setChecked(!cb.isChecked()); } });
চেক আনচেক করার পর যে যে আইটেম গুলো চেক করা হয়েছে, তা পেতে পারি এভাবেঃ
checkItems.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String result = "Checked items: "; for (int i = 0; i < list.getCount(); i++) { v = list.getChildAt(i); CheckBox cb = (CheckBox) v.findViewById(R.id.checkbox); if (cb.isChecked()) { TextView tv = (TextView) v.findViewById(R.id.title); tv.getText(); result += tv.getText() + ", "; } } Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); } });
এই তো! এতটুকু মাত্র। আমাদের সম্পূর্ণ MainActivity.java:
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.CheckBox; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { ArrayList<ShoppingList> shoppingLists = new ArrayList<ShoppingList>(); ListView list; ShoppingListAdapter adapter; Button checkItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); populateListView(); checkItems = (Button) findViewById(R.id.button); checkItems.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String result = "Checked items: "; for (int i = 0; i < list.getCount(); i++) { v = list.getChildAt(i); CheckBox cb = (CheckBox) v.findViewById(R.id.checkbox); if (cb.isChecked()) { TextView tv = (TextView) v.findViewById(R.id.title); tv.getText(); result += tv.getText() + ", "; } } Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); } }); } private void populateListView() { ShoppingList shopping1 = new ShoppingList("Buy Coffee", false); shoppingLists.add(shopping1); ShoppingList shopping2 = new ShoppingList("Buy Milk", true); shoppingLists.add(shopping2); adapter = new ShoppingListAdapter(this, R.layout.list_item, shoppingLists); list = (ListView) findViewById(R.id.list_view); list.setAdapter(adapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckBox cb = (CheckBox) view.findViewById(R.id.checkbox); cb.setChecked(!cb.isChecked()); } }); } }
সোর্সকোড গুলো পাওয়া যাবে গিটহাবে। অ্যান্ড্রয়েড নিয়ে সব গুলো লেখার লিস্ট পাওয়া যাবে অ্যাপ ডেভেলপমেন্ট পেইজে।
আমি এই ধরনের একটি কাজ করেছিলাম। আপনার কোডের সাথে আমার কোড ৯০% মিলে গেছে।