কাস্টম ArrayAdapter দিয়ে ListView স্টাইলিং
এই টিউটোরিয়ালটি দেখায় কীভাবে কাস্টম অ্যাডাপ্টার ব্যবহার করে ListView-এর প্রতিটি আইটেমের টেক্সট রঙ, ফন্ট, ব্যাকগ্রাউন্ড ইত্যাদি পরিবর্তন করা যায়।
ধাপ ১: প্রজেক্ট তৈরি করুন
Android Studio-তে নতুন প্রজেক্ট।
ধাপ ২: লেআউট (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:background="#fbf9ea"
tools:context=".MainActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="8dp" />
</RelativeLayout>
ধাপ ৩: কাস্টম আইটেম লেআউট (res/layout/list_item.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp"
android:background="@drawable/list_item_bg">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#212121" />
<TextView
android:id="@+id/tvSubtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textSize="14sp"
android:textColor="#757575" />
</LinearLayout>
ধাপ ৪: ড্রয়েবল ব্যাকগ্রাউন্ড (res/drawable/list_item_bg.xml)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<solid android:color="#E0E0E0" />
<corners android:radius="8dp" />
</shape>
</item>
<item android:state_selected="true">
<shape>
<solid android:color="#BBDEFB" />
<corners android:radius="8dp" />
</shape>
</item>
<item>
<shape>
<solid android:color="#FFFFFF" />
<corners android:radius="8dp" />
<stroke android:width="1dp" android:color="#E0E0E0" />
</shape>
</item>
</selector>
ধাপ ৫: কাস্টম অ্যাডাপ্টার (CustomAdapter.java)
package com.app.sample;
import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.List;
public class CustomAdapter extends ArrayAdapter<String> {
private Context context;
private List<String> items;
private int layoutResourceId;
public CustomAdapter(@NonNull Context context, int resource, @NonNull List<String> items) {
super(context, resource, items);
this.context = context;
this.items = items;
this.layoutResourceId = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.tvTitle = convertView.findViewById(R.id.tvTitle);
holder.tvSubtitle = convertView.findViewById(R.id.tvSubtitle);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
String item = items.get(position);
holder.tvTitle.setText(item);
holder.tvSubtitle.setText("আইটেম নম্বর: " + (position + 1));
// কাস্টম ফন্ট প্রয়োগ (assets/fonts/ থেকে)
// Typeface customFont = Typeface.createFromAsset(context.getAssets(), "fonts/custom_font.ttf");
// holder.tvTitle.setTypeface(customFont);
// holder.tvSubtitle.setTypeface(customFont);
// পজিশন অনুযায়ী রঙ পরিবর্তন
if (position % 2 == 0) {
holder.tvTitle.setTextColor(Color.parseColor("#1565C0")); // নীল
} else {
holder.tvTitle.setTextColor(Color.parseColor("#C62828")); // লাল
}
return convertView;
}
static class ViewHolder {
TextView tvTitle;
TextView tvSubtitle;
}
}
ধাপ ৬: MainActivity.java
package com.app.sample;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = findViewById(R.id.lv);
List<String> data = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
data.add("আইটেম " + i);
}
CustomAdapter adapter = new CustomAdapter(this, R.layout.list_item, data);
listView.setAdapter(adapter);
// ক্লিক লিসনার
listView.setOnItemClickListener((parent, view, position, id) -> {
String selected = data.get(position);
Toast.makeText(this, "সিলেক্টেড: " + selected, Toast.LENGTH_SHORT).show();
});
}
}
ধাপ ৭: ম্যানিফেস্ট
সাধারণ কনফিগারেশন।
RecyclerView-এ মাইগ্রেশন (সুপারিশড)
ListView ডিপ্রিকেটেড নয় কিন্তু RecyclerView বেশি linh hoạt এবং পারফরম্যান্স ভালো:
// build.gradle implementation "androidx.recyclerview:recyclerview:1.3.2" // Adapter প্যাটার্ন একই (ViewHolder, onBindViewHolder) // LayoutManager: LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager // ItemAnimator, ItemDecoration বিল্ট-ইন সাপোর্ট
ফন্ট রিসোর্স যোগ করা (API 26+)
<!-- res/font/my_font.xml -->
<font-family xmlns:android="https://schemas.android.com/apk/res/android">
<font android:fontStyle="normal" android:fontWeight="400" android:font="@font/my_font_regular" />
<font android:fontStyle="italic" android:fontWeight="400" android:font="@font/my_font_italic" />
</font-family>
// XML-এ ব্যবহার
<TextView
android:fontFamily="@font/my_font"
android:textStyle="bold|italic" />
// কোডে
Typeface typeface = ResourcesCompat.getFont(context, R.font.my_font);
textView.setTypeface(typeface);