ArrayAdapter ও জেনেরিক টাইপ
ArrayAdapter সাধারণত ArrayAdapter<String> হিসেবে ব্যবহার করা হয়, যা শুধু স্ট্রিং ধারণ করতে পারে। যদি আপনি বিভিন্ন ডেটা টাইপ (ইন্টিজার, ডাবল, অবজেক্ট ইত্যাদি) একসাথে ListView-এ দেখাতে চান, তবে সেগুলোকে স্ট্রিং-এ রূপান্তর করে Add করতে হবে বা কাস্টম অ্যাডাপ্টার তৈরি করতে হবে।
উদাহরণ: Collections.checkedCollection() ব্যবহার
এই উদাহরণে Collections.checkedCollection() ব্যবহার করে টাইপ-সেফ ArrayList তৈরি করা হয়েছে, যা রানটাইমে নন-স্ট্রিং অবজেক্ট যোগ করা রোধ করে।
ধাপ ১-২: প্রজেক্ট ও লেআউট
পূর্বের উদাহরণের মতো activity_main.xml ব্যবহার করুন।
ধাপ ৩: MainActivity.java - টাইপ সেফ ArrayList
package com.example.mixedtypeslistview;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class MainActivity extends AppCompatActivity {
EditText name;
ArrayAdapter<String> arrayAdapter;
ArrayList<String> arrayList;
Set<String> nameSet = new HashSet<>();
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arrayList = new ArrayList<>();
arrayList.ensureCapacity(20);
name = findViewById(R.id.name);
listView = findViewById(R.id.listView);
findViewById(R.id.refresh).setOnClickListener(v -> {
if (arrayAdapter != null) {
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(v -> {
String inputName = name.getText().toString().trim();
if (!inputName.isEmpty()) {
nameSet.add(inputName);
arrayList.clear();
if (arrayList.isEmpty()) {
arrayList.addAll(nameSet);
// টাইপ-সেফ কলেকশন তৈরি: শুধু String অনুমোদন করবে
// রানটাইমে অন্য টাইপ যোগ করলে ClassCastException থ্রো করবে
Collections.checkedCollection(arrayList, String.class);
arrayList.trimToSize();
arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
listView.setAdapter(arrayAdapter);
} else {
listView.setVisibility(View.GONE);
}
Toast.makeText(this, "সংরক্ষণ সফল", Toast.LENGTH_LONG).show();
} else {
name.setError("নাম লিখুন");
}
});
}
}
বিভিন্ন ডেটা টাইপ ListView-এ দেখানোর পদ্ধতিসমূহ
পদ্ধতি ১: স্ট্রিং-এ রূপান্তর (সহজ)
ArrayList<String> list = new ArrayList<>();
list.add("নাম: " + "রহিম");
list.add("বয়স: " + 25); // ইন্টিজার → স্ট্রিং
list.add("বেতন: " + 25000.50); // ডাবল → স্ট্রিং
list.add("সক্রিয়: " + true); // বুলিয়ান → স্ট্রিং
পদ্ধতি ২: কাস্টম অবজেক্ট ও কাস্টম অ্যাডাপ্টার (প্রফেশনাল)
// মডেল ক্লাস
public class Employee {
String name;
int age;
double salary;
boolean active;
// কনস্ট্রাক্টর, গেটার, সেটার
@Override
public String toString() {
return name + " | " + age + " | " + salary + " | " + (active ? "হ্যাঁ" : "না");
}
}
// কাস্টম অ্যাডাপ্টার
public class EmployeeAdapter extends ArrayAdapter<Employee> {
// getView() ওভাররাইড করে কাস্টম লেআউট বাঁধুন
}
পদ্ধতি ৩: Map<String, Object> ব্যবহার করে
List<Map<String, Object>> data = new ArrayList<>();
Map<String, Object> item = new HashMap<>();
item.put("name", "রহিম");
item.put("age", 25);
item.put("salary", 25000.50);
data.add(item);
// SimpleAdapter ব্যবহার করুন
চলাচল ও ফলাফল
অ্যাপ রান করুন। নাম হিসেবে স্ট্রিং বা সংখ্যা লিখে Save দিন। ListView-এ সব কিছু স্ট্রিং আকারে দেখাবে। checkedCollection এর কারণে আপনি প্রোগ্রাম্যাটিক্যালি ইন্টিজার যোগ করলে ক্র্যাশ করবে।

ফলাফলে স্ট্রিং এবং ইন্টিজার মিশ্রিত ডেটা ListView-এ দেখানো হয়েছে।