কম্পিউটার টিউটোরিয়াল

এন্ড্রয়েডে কোটলিন ব্যবহার করে RecyclerView-এ endl weniger লিস্ট বাস্তবায়নের পদ্ধতি

RecyclerView.OnScrollListener ব্যবহার করে ইনফিনিট স্ক্রোলিং

এই উদাহরণটি দেখায় কিভাবে কোটলিন ব্যবহার করে এন্ড্রয়েডে RecyclerView-এ endl হয় লিস্ট (infinite scrolling) বাস্তবায়ন করা যায়। OnScrollListener ব্যবহার করে নিচে পৌঁছালে নতুন ডেটা লোড করা হয়।

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন

Android Studio-তে File → New Project এ যান এবং প্রজেক্ট তৈরি করুন। RecyclerView এবং CardView নির্ভরতা যোগ করুন।

ধাপ ২: আইটেম লেআউট (item_row.xml) তৈরি করুন

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardElevation="2dp"
    app:cardUseCompatPadding="true">

    <TextView
        android:id="@+id/textViewItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textColor="@android:color/holo_blue_bright"
        android:textStyle="bold" />

</androidx.cardview.widget.CardView>

ধাপ ৩: লোডিং লেআউট (item_loading.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="match_parent"
    android:orientation="vertical">

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:indeterminate="true"
        android:paddingLeft="8dp"
        android:paddingRight="8dp" />

</LinearLayout>

ধাপ ৪: RecyclerViewAdapter.kt ক্লাস তৈরি করুন

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ProgressBar
import android.widget.TextView
import androidx.annotation.NonNull
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder

class RecyclerViewAdapter internal constructor(private val itemList: List<String>) : RecyclerView.Adapter<ViewHolder>() {
    private val viewItemType = 0

    @NonNull
    override fun onCreateViewHolder(@NonNull parent: ViewGroup, viewType: Int): ViewHolder {
        return if (viewType == viewItemType) {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.item_row, parent, false)
            ItemViewHolder(view)
        } else {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.item_loading, parent, false)
            LoadingViewHolder(view)
        }
    }

    override fun onBindViewHolder(@NonNull viewHolder: ViewHolder, position: Int) {
        if (viewHolder is ItemViewHolder) {
            populateItemRows(viewHolder, position)
        } else if (viewHolder is LoadingViewHolder) {
            showLoadingView(viewHolder, position)
        }
    }

    override fun getItemViewType(position: Int): Int {
        return viewItemType
    }

    private inner class ItemViewHolder internal constructor(@NonNull itemView: View) : ViewHolder(itemView) {
        internal var tvItem: TextView = itemView.findViewById(R.id.textViewItem)
    }

    private class LoadingViewHolder internal constructor(itemView: View) : ViewHolder(itemView) {
        var progressBar: ProgressBar = itemView.findViewById(R.id.progressBar)
    }

    override fun getItemCount(): Int {
        return itemList.size
    }

    private fun showLoadingView(viewHolder: LoadingViewHolder, position: Int) {}

    private fun populateItemRows(viewHolder: ItemViewHolder, position: Int) {
        val item = itemList[position]
        viewHolder.tvItem.text = item
    }
}

ধাপ ৫: MainActivity.kt ফাইলে লজিক লিখুন

import android.os.Bundle
import android.os.Handler
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class MainActivity : AppCompatActivity() {
    lateinit var recyclerView: RecyclerView
    lateinit var recyclerViewAdapter: RecyclerViewAdapter
    var rowsArrayList: ArrayList<String> = ArrayList()
    var isLoading = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"

        recyclerView = findViewById(R.id.recyclerView)
        populateData()
        initAdapter()
        initScrollListener()
    }

    private fun initScrollListener() {
        recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)
                val linearLayoutManager = recyclerView.layoutManager as LinearLayoutManager?
                if (!isLoading) {
                    if (linearLayoutManager != null && linearLayoutManager.findLastCompletelyVisibleItemPosition() == rowsArrayList.size - 1) {
                        loadMore()
                        isLoading = true
                    }
                }
            }
        })
    }

    private fun initAdapter() {
        recyclerViewAdapter = RecyclerViewAdapter(rowsArrayList)
        recyclerView.layoutManager = LinearLayoutManager(applicationContext)
        recyclerView.adapter = recyclerViewAdapter
    }

    private fun populateData() {
        for (i in 0..9) {
            rowsArrayList.add("Number $i")
        }
    }

    private fun loadMore() {
        rowsArrayList.add("null")
        recyclerViewAdapter.notifyItemInserted(rowsArrayList.size - 1)

        val handler = Handler()
        handler.postDelayed(Runnable {
            rowsArrayList.removeAt(rowsArrayList.size - 1)
            val scrollPosition = rowsArrayList.size
            recyclerViewAdapter.notifyItemRemoved(scrollPosition)
            var currentSize = scrollPosition
            val nextLimit = currentSize + 10
            while (currentSize - 1 < nextLimit) {
                rowsArrayList.add("Number $currentSize")
                currentSize++
            }
            recyclerViewAdapter.notifyDataSetChanged()
            isLoading = false
        }, 2000)
    }
}

ধাপ ৬: activity_main.xml-এ RecyclerView যোগ করুন

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="https://schemas.android.com/apk/res/android"
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

ধাপ ৭: AndroidManifest.xml আপডেট করুন

সাধারণ ম্যানিফেস্ট কনফিগারেশন যথেষ্ট।

অ্যাপ্লিকেশন চালানোর পদ্ধতি

ডিভাইস সংযুক্ত করে Run করুন। নিচে স্ক্রোল করলে নতুন আইটেম লোড হবে। প্রগ্রেসবার দেখাবে এবং ২ সেকেন্ড পর নতুন ডেটা যোগ হবে।

  1. RecyclerView ব্যবহার করে হরিজেন্টাল ListView তৈরি করার উপায়

  2. RecyclerView-এ ConstraintLayout ব্যবহারের পদ্ধতি

  3. অ্যান্ড্রয়েডে SearchView দিয়ে RecyclerView ফিল্টার করবেন কীভাবে?

  4. Android-এ RecyclerView-এ অসীম লিস্ট (Endless Scrolling) বাস্তবায়ন