অ্যান্ড্রয়েড জেটপ্যাকের রিসাইক্লারভিউ অংশ দিয়ে গতিশীল তালিকা তৈরি করুন।

রচনা পদ্ধতি চেষ্টা করুন
জেটপ্যাক কম্পোজ হল Android এর জন্য প্রস্তাবিত UI টুলকিট। কম্পোজে লেআউটের সাথে কীভাবে কাজ করবেন তা শিখুন।

RecyclerView দক্ষতার সাথে ডেটার বড় সেট প্রদর্শন করা সহজ করে তোলে। আপনি ডেটা সরবরাহ করেন এবং প্রতিটি আইটেমকে কীভাবে দেখায় তা সংজ্ঞায়িত করেন এবং যখন প্রয়োজন হয় তখন RecyclerView লাইব্রেরি গতিশীলভাবে উপাদানগুলি তৈরি করে।

নামটি বোঝায়, RecyclerView সেই পৃথক উপাদানগুলিকে পুনর্ব্যবহার করে । যখন একটি আইটেম পর্দা বন্ধ স্ক্রোল, RecyclerView এর দৃশ্য ধ্বংস করে না। পরিবর্তে, RecyclerView নতুন আইটেমগুলির জন্য দৃশ্যটি পুনঃব্যবহার করে যা অনস্ক্রীনে স্ক্রোল করা হয়েছে। RecyclerView কর্মক্ষমতা এবং আপনার অ্যাপের প্রতিক্রিয়াশীলতা উন্নত করে এবং এটি পাওয়ার খরচ কমায়।

মূল ক্লাস

আপনার গতিশীল তালিকা তৈরি করতে বেশ কয়েকটি ক্লাস একসাথে কাজ করে।

  • RecyclerView হল ViewGroup যেটিতে আপনার ডেটার সাথে সম্পর্কিত ভিউ রয়েছে। এটি নিজেই একটি দৃশ্য, তাই আপনি আপনার লেআউটে RecyclerView যোগ করেন যেভাবে আপনি অন্য কোনো UI উপাদান যোগ করবেন।

  • তালিকার প্রতিটি পৃথক উপাদান একটি ভিউ হোল্ডার অবজেক্ট দ্বারা সংজ্ঞায়িত করা হয়। যখন ভিউ হোল্ডার তৈরি করা হয়, তখন এটির সাথে যুক্ত কোনো ডেটা থাকে না। ভিউ হোল্ডার তৈরি হওয়ার পরে, RecyclerView এটিকে তার ডেটাতে আবদ্ধ করে । আপনি RecyclerView.ViewHolder প্রসারিত করে ভিউ হোল্ডারকে সংজ্ঞায়িত করেন।

  • RecyclerView ভিউ অনুরোধ করে এবং অ্যাডাপ্টারে পদ্ধতি কল করে ভিউগুলিকে তাদের ডেটাতে আবদ্ধ করে। আপনি RecyclerView.Adapter প্রসারিত করে অ্যাডাপ্টার সংজ্ঞায়িত করেন।

  • লেআউট ম্যানেজার আপনার তালিকার পৃথক উপাদানগুলিকে সাজায়। আপনি RecyclerView লাইব্রেরি দ্বারা প্রদত্ত লেআউট ম্যানেজারগুলির একটি ব্যবহার করতে পারেন, অথবা আপনি আপনার নিজের সংজ্ঞায়িত করতে পারেন। লেআউট ম্যানেজাররা সবই লাইব্রেরির LayoutManager অ্যাবস্ট্রাক্ট ক্লাসের উপর ভিত্তি করে।

রিসাইক্লারভিউ স্যাম্পল অ্যাপ (কোটলিন) বা রিসাইক্লারভিউ স্যাম্পল অ্যাপ (জাভা) -এ আপনি দেখতে পারেন কিভাবে সমস্ত টুকরো একসাথে ফিট করে।

আপনার RecyclerView বাস্তবায়নের জন্য পদক্ষেপ

আপনি যদি RecyclerView ব্যবহার করতে যাচ্ছেন, তাহলে আপনাকে কিছু জিনিস করতে হবে। তারা নিম্নলিখিত বিভাগে বিস্তারিতভাবে ব্যাখ্যা করা হয়.

  1. তালিকা বা গ্রিড দেখতে কেমন তা নির্ধারণ করুন। সাধারণত, আপনি RecyclerView লাইব্রেরির স্ট্যান্ডার্ড লেআউট ম্যানেজারগুলির একটি ব্যবহার করতে পারেন।

  2. তালিকার প্রতিটি উপাদান কীভাবে দেখায় এবং আচরণ করে তা ডিজাইন করুন। এই নকশার উপর ভিত্তি করে, ViewHolder ক্লাস প্রসারিত করুন। আপনার ViewHolder সংস্করণ আপনার তালিকা আইটেমগুলির জন্য সমস্ত কার্যকারিতা প্রদান করে। আপনার ভিউ হোল্ডার হল একটি View চারপাশে একটি মোড়ক, এবং সেই ভিউটি RecyclerView দ্বারা পরিচালিত হয়।

  3. Adapter সংজ্ঞায়িত করুন যা ViewHolder দর্শনের সাথে আপনার ডেটা সংযুক্ত করে।

এছাড়াও উন্নত কাস্টমাইজেশন বিকল্প রয়েছে যা আপনাকে আপনার রিসাইক্লারভিউকে আপনার সঠিক প্রয়োজন অনুসারে তৈরি করতে দেয়।

আপনার লেআউট পরিকল্পনা

আপনার RecyclerView-এর আইটেমগুলি একটি LayoutManager ক্লাস দ্বারা সাজানো হয়েছে। RecyclerView লাইব্রেরি তিনটি লেআউট ম্যানেজার প্রদান করে, যা সবচেয়ে সাধারণ লেআউট পরিস্থিতি পরিচালনা করে:

  • LinearLayoutManager আইটেমগুলিকে এক-মাত্রিক তালিকায় সাজায়।
  • GridLayoutManager একটি দ্বি-মাত্রিক গ্রিডে আইটেমগুলি সাজায়:
    • যদি গ্রিডটি উল্লম্বভাবে সাজানো হয়, GridLayoutManager চেষ্টা করে প্রতিটি সারির সমস্ত উপাদানের প্রস্থ এবং উচ্চতা একই, কিন্তু বিভিন্ন সারির উচ্চতা ভিন্ন হতে পারে।
    • যদি গ্রিড অনুভূমিকভাবে সাজানো হয়, GridLayoutManager চেষ্টা করে প্রতিটি কলামের সমস্ত উপাদানের প্রস্থ এবং উচ্চতা একই, কিন্তু বিভিন্ন কলামের বিভিন্ন প্রস্থ থাকতে পারে।
  • StaggeredGridLayoutManager GridLayoutManager এর মতোই, কিন্তু এটির প্রয়োজন নেই যে একটি সারিতে থাকা আইটেমগুলির একই উচ্চতা (উল্লম্ব গ্রিডের জন্য) বা একই কলামের আইটেমগুলির প্রস্থ একই (অনুভূমিক গ্রিডের জন্য)। ফলাফল হল যে একটি সারি বা কলামের আইটেমগুলি একে অপরের থেকে অফসেট শেষ করতে পারে।

আপনাকে পৃথক আইটেমগুলির বিন্যাসও ডিজাইন করতে হবে। আপনি যখন ভিউ হোল্ডার ডিজাইন করবেন তখন আপনার এই লেআউটটি প্রয়োজন, যেমনটি পরবর্তী বিভাগে বর্ণনা করা হয়েছে।

আপনার অ্যাডাপ্টার এবং ভিউ হোল্ডার প্রয়োগ করুন

একবার আপনি আপনার লেআউট নির্ধারণ করলে, আপনাকে আপনার Adapter এবং ViewHolder বাস্তবায়ন করতে হবে। আপনার ডেটা কীভাবে প্রদর্শিত হবে তা নির্ধারণ করতে এই দুটি শ্রেণী একসাথে কাজ করে। ViewHolder হল একটি View চারপাশে একটি মোড়ক যাতে তালিকার একটি পৃথক আইটেমের বিন্যাস থাকে। Adapter প্রয়োজন অনুযায়ী ViewHolder অবজেক্ট তৈরি করে এবং সেই ভিউগুলির জন্য ডেটাও সেট করে। তাদের ডেটার সাথে ভিউ যুক্ত করার প্রক্রিয়াটিকে বাইন্ডিং বলা হয়।

যখন আপনি আপনার অ্যাডাপ্টার সংজ্ঞায়িত করেন, আপনি তিনটি মূল পদ্ধতি ওভাররাইড করেন:

  • onCreateViewHolder() : RecyclerView এই পদ্ধতিটিকে কল করে যখনই এটি একটি নতুন ViewHolder তৈরি করতে হয়। পদ্ধতিটি ViewHolder এবং এর সাথে সম্পর্কিত View তৈরি করে এবং শুরু করে, কিন্তু ভিউ-এর বিষয়বস্তু পূরণ করে নাViewHolder এখনও নির্দিষ্ট ডেটার সাথে আবদ্ধ হয়নি।

  • onBindViewHolder() : RecyclerView ডেটার সাথে একটি ViewHolder সংযুক্ত করতে এই পদ্ধতিটিকে কল করে। পদ্ধতিটি উপযুক্ত ডেটা নিয়ে আসে এবং ভিউ হোল্ডারের লেআউট পূরণ করতে ডেটা ব্যবহার করে। উদাহরণস্বরূপ, যদি RecyclerView নামের একটি তালিকা প্রদর্শন করে, তবে পদ্ধতিটি তালিকায় উপযুক্ত নাম খুঁজে পেতে পারে এবং ভিউ হোল্ডারের TextView উইজেটটি পূরণ করতে পারে।

  • getItemCount() : RecyclerView ডেটাসেটের আকার পেতে এই পদ্ধতিটিকে কল করে। উদাহরণস্বরূপ, একটি ঠিকানা বই অ্যাপে, এটি ঠিকানার মোট সংখ্যা হতে পারে। RecyclerView এটি ব্যবহার করে তা নির্ধারণ করতে কখন আর কোন আইটেম প্রদর্শিত হবে না।

এখানে নেস্টেড ViewHolder সহ একটি সাধারণ অ্যাডাপ্টারের একটি সাধারণ উদাহরণ যা ডেটার একটি তালিকা প্রদর্শন করে। এই ক্ষেত্রে, RecyclerView পাঠ্য উপাদানগুলির একটি সহজ তালিকা প্রদর্শন করে। অ্যাডাপ্টারটি ViewHolder উপাদানগুলির জন্য পাঠ্য ধারণকারী স্ট্রিংগুলির একটি অ্যারে পাস করেছে।

কোটলিন

class CustomAdapter(private val dataSet: Array<String>) :
        RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    /**
     * Provide a reference to the type of views that you are using
     * (custom ViewHolder)
     */
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView

        init {
            // Define click listener for the ViewHolder's View
            textView = view.findViewById(R.id.textView)
        }
    }

    // Create new views (invoked by the layout manager)
    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
        // Create a new view, which defines the UI of the list item
        val view = LayoutInflater.from(viewGroup.context)
                .inflate(R.layout.text_row_item, viewGroup, false)

        return ViewHolder(view)
    }

    // Replace the contents of a view (invoked by the layout manager)
    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {

        // Get element from your dataset at this position and replace the
        // contents of the view with that element
        viewHolder.textView.text = dataSet[position]
    }

    // Return the size of your dataset (invoked by the layout manager)
    override fun getItemCount() = dataSet.size

}

জাভা

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

    private String[] localDataSet;

    /**
     * Provide a reference to the type of views that you are using
     * (custom ViewHolder)
     */
    public static class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView textView;

        public ViewHolder(View view) {
            super(view);
            // Define click listener for the ViewHolder's View

            textView = (TextView) view.findViewById(R.id.textView);
        }

        public TextView getTextView() {
            return textView;
        }
    }

    /**
     * Initialize the dataset of the Adapter
     *
     * @param dataSet String[] containing the data to populate views to be used
     * by RecyclerView
     */
    public CustomAdapter(String[] dataSet) {
        localDataSet = dataSet;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        // Create a new view, which defines the UI of the list item
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.text_row_item, viewGroup, false);

        return new ViewHolder(view);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {

        // Get element from your dataset at this position and replace the
        // contents of the view with that element
        viewHolder.getTextView().setText(localDataSet[position]);
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return localDataSet.length;
    }
}

প্রতিটি ভিউ আইটেমের লেআউট যথারীতি একটি XML লেআউট ফাইলে সংজ্ঞায়িত করা হয়। এই ক্ষেত্রে, অ্যাপটির একটি text_row_item.xml ফাইল রয়েছে:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/list_item_height"
    android:layout_marginLeft="@dimen/margin_medium"
    android:layout_marginRight="@dimen/margin_medium"
    android:gravity="center_vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/element_text"/>
</FrameLayout>

পরবর্তী পদক্ষেপ

নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে আপনি RecyclerView ব্যবহার করতে পারেন।

কোটলিন

class MainActivity : AppCompatActivity() {

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

        val dataset = arrayOf("January", "February", "March")
        val customAdapter = CustomAdapter(dataset)

        val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = customAdapter

    }

}

জাভা

RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.layoutManager = new LinearLayoutManager(this)
recyclerView.setAdapter(customAdapter);

লাইব্রেরি আপনার বাস্তবায়ন কাস্টমাইজ করার অনেক উপায়ও অফার করে। আরও তথ্যের জন্য, অ্যাডভান্সড রিসাইক্লারভিউ কাস্টমাইজেশন দেখুন।

অতিরিক্ত সম্পদ

অ্যান্ড্রয়েড পরীক্ষা সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন৷

নমুনা অ্যাপ্লিকেশন