جلسه 3 نمایش فهرست ها با Recycler View
مقدمه و مفهوم
در توسعه اندروید، نمایش لیستهای طولانی از دادهها چالشبرانگیز است. ویجت قدیمی ListView با افزایش تعداد آیتمها دچار افت عملکرد میشد زیرا تمام عناصر را در حافظه نگه میداشت. RecyclerView این مشکل را با رویکردی متفاوت حل کرده است. این ویجت با استفاده از الگوی بازیافت (Recycling) Views، فقط آن بخش از لیست را که در صفحه نمایش داده میشود در حافظه نگه میدارد و با اسکرول کردن، المانهای خارج از کادر را بازیافت و برای آیتمهای جدید استفاده میکند. این رویکرد باعث کاهش چشمگیر مصرف حافظه و افزایش روانی اسکرول میشود.
🔖 ۱. معماری و اجزای کلیدی
برای استفاده از RecyclerView باید با چهار رکن اصلی آن آشنا شوید که هر کدام وظیفه مشخصی دارند:
۱.۱. RecyclerView
خود ویجت اصلی است که در لایه XML تعریف میشود. وظیفه آن مدیریت فضای نمایش و هندل کردن رویدادهای لمسی است. به تنهایی کاری انجام نمیدهد و نیاز به اجزای کمکی دارد.
۱.۲. LayoutManager
این کلاس مسئول چیدمان آیتمها در داخل RecyclerView است. شما تعیین میکنید آیتمها چگونه قرار بگیرند:
- LinearLayoutManager: نمایش لیست عمودی یا افقی (مانند لیست تماسها).
- GridLayoutManager: نمایش شبکهای (مانند گالری تصاویر).
- StaggeredGridLayoutManager: نمایش شبکهای نامنظم (مانند پینترست).
۱.۳. ItemDecoration
این کلاس برای افزودن جداکننده (Divider)، پدینگ یا افکتهای بصری بین آیتمها استفاده میشود. مثلاً خطی خاکستری بین دو آیتم لیست.
۱.۴. ItemAnimator
این کلاس انیمیشنهای پیشفرض را برای افزودن، حذف یا جابجایی آیتمها مدیریت میکند. وقتی آیتمی اضافه یا حذف میشود، این کلاس انیمیشن حرکت آن را اجرا میکند.
🔖 ۲. آداپتور (Adapter) و ViewHolder
این بخش حیاتیترین قسمت پیادهسازی است.
۲.۱. ViewHolder
یک کلاس داخلی است که به هر View در لیست متصل میشود. ViewHolder ویوهای داخلی هر آیتم (مثل ImageView یا TextView) را در خود نگه میدارد. با استفاده از آن، دیگر نیازی به فراخوانی متد findViewById در هر بار نمایش آیتم نیست که این کار سرعت را به شدت افزایش میدهد.
۲.۲. Adapter
نقش Adapter اتصال دادهها (Data Source) به ویوهای نمایشی است. این کلاس سه متد اصلی دارد:
- onCreateViewHolder: ایجاد ویو جدید برای آیتمهای جدید.
- onBindViewHolder: پر کردن دادهها در ویوی بازیافت شده.
- getItemCount: تعداد کل آیتمهای لیست.
🔖 ۳. مراحل پیادهسازی گامبهگام
برای ایجاد یک لیست ساده، مراحل زیر باید طی شوند:
گام اول: اضافه کردن وابستگی
در فایل build.gradle ماژول اپلیکیشن، کتابخانه RecyclerView را اضافه کنید. این کتابخانه معمولاً به صورت پیشفرض در پروژههای جدید موجود است اما اگر نباشد باید افزوده شود.
گام دوم: طراحی لایه لیست (XML)
یک ویجت RecyclerView را در فایل لایه اکتیو یا فرگمنت تعریف کنید. برای این ویجت باید android:layout_width و android:layout_height را مشخص کنید.
گام سوم: طراحی لایه آیتم (Item Layout)
یک فایل XML جداگانه برای ظاهر هر آیتم لیست طراحی کنید. این لایه شامل ویوهای داخلی مثل عکس و متن است که توسط ViewHolder مدیریت میشوند.
گام چهارم: ایجاد کلاس Adapter
یک کلاس جدید ایجاد کنید که از RecyclerView.Adapter<YourViewHolder> ارثبری کند. در این کلاس:
- کلاس ViewHolder را تعریف کنید.
- متدهای
onCreateViewHolder,onBindViewHolder, وgetItemCountرا پیادهسازی کنید. - دادههای خود را به آداپتور پاس دهید.
گام پنجم: اتصال به اکتیویتی/فرگمنت
در کلاس جاوا یا کاتلین اکتیویتی:
- نمونهای از RecyclerView را با استفاده از
findViewByIdدریافت کنید. - یک
LayoutManagerبسازید و به RecyclerView اختصاص دهید. - یک نمونه از آداپتور بسازید و دادهها را به آن بدهید.
- آداپتور را با متد
setAdapterبه RecyclerView متصل کنید.
📝 خلاصه نکات کلیدی
✅ عملکرد بالا: RecyclerView فقط ویوهای قابل مشاهده را در حافظه نگه میدارد و آیتمهای خارج از کادر را بازیافت میکند.
✅ جداسازی مسئولیتها: جدا کردن منطق چیدمان (LayoutManager)، ظاهر (Adapter/ViewHolder) و انیمیشن (ItemAnimator) باعث کدنویسی تمیزتر و ماژولارتر میشود.
✅ الگوی ViewHolder: استفاده از ViewHolder ضروری است تا از فراخوانی مکرر
findViewByIdجلوگیری شود و عملکرد لیست بهینه گردد.
✅ انعطافپذیری: با تغییر LayoutManager میتوان همان لیست را هم به صورت لیستی و هم به صورت شبکهای نمایش داد بدون تغییر در منطق آداپتور.
✅ مدیریت رویدادها: برای پاسخ به کلیک روی آیتمها، باید از
RecyclerView.OnItemTouchListenerیا کلیک در داخل متدonBindViewHolderآداپتور استفاده کرد.
❓ سوالات تمرینی پایان فصل
۱. تفاوت اصلی بین ListView و RecyclerView را از نظر مدیریت حافظه و عملکرد توضیح دهید.
۲. چرا استفاده از الگوی ViewHolder در آداپتورهای RecyclerView ضروری است؟ اگر از آن استفاده نکنیم چه مشکلی پیش میآید؟
۳. اگر بخواهید لیستی را که شامل آیتمهایی با ارتفاعهای متغیر و نامنظم است (مانند پستهای شبکه اجتماعی) ایجاد کنید، کدام LayoutManager مناسبتر است و چرا؟
۴. نقش ItemDecoration در RecyclerView چیست؟ آیا میتوان بدون استفاده از آن، بین آیتمها فاصله ایجاد کرد؟ توضیح دهید.
۵. در متد onBindViewHolder، اگر دادههای لیست در حین اسکرول تغییر کنند، چه کاری باید انجام دهید تا تغییرات در UI اعمال شود؟
۶. چگونه میتوانیم انیمیشن پیشفرض افزودن و حذف آیتمها را غیرفعال یا سفارشیسازی کنیم؟