ওভারভিউ
এই টিউটোরিয়ালটি দেখায় কিভাবে AbsListView.OnScrollListener ব্যবহার করে ListView-এ উপরে (Scroll Up) এবং নিচে (Scroll Down) স্ক্রলিং ডিটেক্ট করা যায়। এটি ইনফিনিট স্ক্রলিং, টুলবার হাইড/শো ইত্যাদি ফিচারের জন্য কাজে লাগে।
পূর্বশর্ত
- অ্যান্ড্রয়েড স্টুডিও (কোটলিন)
- ListView ও Adapter বেসিক জ্ঞান
ধাপ ১: প্রজেক্ট তৈরি করুন
File → New Project → Empty Activity → Language: Kotlin।
ধাপ ২: লেআউট (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp"
tools:context=".MainActivity">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
ধাপ ৩: MainActivity.kt
package com.example.listviewscroll
import android.os.Bundle
import android.widget.AbsListView
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var listView: ListView
private val numbers = arrayOf(
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23", "24", "25"
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
listView = findViewById(R.id.listView)
val adapter = ArrayAdapter(
this,
android.R.layout.simple_list_item_1,
numbers
)
listView.adapter = adapter
// স্ক্রল লিসেনার সেট করুন
listView.setOnScrollListener(object : AbsListView.OnScrollListener {
private var lastFirstVisibleItem = 0
override fun onScrollStateChanged(view: AbsListView, scrollState: Int) {
// SCROLL_STATE_IDLE, TOUCH_SCROLL, FLING
}
override fun onScroll(
view: AbsListView,
firstVisibleItem: Int,
visibleItemCount: Int,
totalItemCount: Int
) {
if (lastFirstVisibleItem < firstVisibleItem) {
// নিচে স্ক্রল (Scroll Down)
Toast.makeText(
applicationContext,
"Scrolling down the ListView",
Toast.LENGTH_SHORT
).show()
} else if (lastFirstVisibleItem > firstVisibleItem) {
// উপরে স্ক্রল (Scroll Up)
Toast.makeText(
applicationContext,
"Scrolling up the ListView",
Toast.LENGTH_SHORT
).show()
}
lastFirstVisibleItem = firstVisibleItem
}
})
}
}
ধাপ ৪: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.listviewscroll">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
চলান ও ফলাফল
- অ্যাপ চালান → লিস্টভিউ দেখাবে।
- নিচে স্ক্রল করলে "Scrolling down..." টোস্ট।
- উপরে স্ক্রল করলে "Scrolling up..." টোস্ট।
গুরুত্বপূর্ণ নোট: ListView vs RecyclerView
ListView ডিপ্রিকেটেড নয় কিন্তু RecyclerView পছন্দনীয়। RecyclerView-এ স্ক্রল লিসেনার আলাদা:
// RecyclerView জন্য
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
if (dy > 0) {
// Scroll Down
} else if (dy < 0) {
// Scroll Up
}
}
})
ইনফিনিট স্ক্রলিং (Pagination) উদাহরণ
override fun onScroll(...) {
val lastItem = firstVisibleItem + visibleItemCount
if (lastItem >= totalItemCount - 5 && !isLoading) { // ৫ আইটেম বাকি থাকলে
loadMoreData() // API কল করে ডেটা লোড
}
}
টুলবার হাইড/শো (Material Design)
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
if (dy > 0 && toolbar.visibility == View.VISIBLE) {
toolbar.animate().translationY(-toolbar.height.toFloat()).setDuration(200).start()
} else if (dy < 0 && toolbar.visibility == View.GONE) {
toolbar.animate().translationY(0f).setDuration(200).start()
}
}
সতর্কতা
- প্রতিটি স্ক্রল ইভেন্টে টোস্ট দেখানো UX-এ খারাপ (বারবার টোস্ট আসবে)। বাস্তবে লজিক/ইউআই আপডেট করুন।
- ListView-এর বদলে RecyclerView ব্যবহার করুন (ViewHolder প্যাটার্ন, পারফরম্যান্স ভালো)।