09982292579
info@mehraeen.ac.ir
فارسی پرچم
فارسی
یک زبان را انتخاب کنید
فارسی پرچم
فارسی
0
دسته ها
خانه تقویم‌آموزشی مدرس وبلاگ چارت‌‌دروس تماس‌با‌ما درباره‌ما انجمن‌ها
برنامه نویسي موبایل 2

جلسه 3 نمایش فهرست ها با Recycler View

خلاصه نکات کلیدی ✅ عملکرد بالا: RecyclerView فقط ویوهای قابل مشاهده را در حافظه نگه می‌دارد و آیتم‌های خارج از کادر را بازیافت می‌کند. ✅ جداسازی مسئولیت‌ها: جدا کردن منطق چیدمان (LayoutManager)، ظاهر (Adapter/ViewHolder) و انیمیشن (ItemAnimator) باعث کدنویسی تمیزتر و ماژولارتر می‌شود. ✅ الگوی ViewHolder: استفاده از ViewHolder ضروری است تا از فراخوانی مکرر findViewById جلوگیری شود و عملکرد لیست بهینه گردد. ✅ انعطاف‌پذیری: با تغییر LayoutManager می‌توان همان لیست را هم به صورت لیستی و هم به صورت شبکه‌ای نمایش داد بدون تغییر در منطق آداپتور. ✅ مدیریت رویدادها: برای پاسخ به کلیک روی آیتم‌ها، باید از RecyclerView.OnItemTouchListener یا کلیک در داخل متد onBindViewHolder آداپتور استفاده کرد.

 مقدمه و مفهوم

در توسعه اندروید، نمایش لیست‌های طولانی از داده‌ها چالش‌برانگیز است. ویجت قدیمی 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 را پیاده‌سازی کنید.
  • داده‌های خود را به آداپتور پاس دهید.

گام پنجم: اتصال به اکتیویتی/فرگمنت
در کلاس جاوا یا کاتلین اکتیویتی:

  1. نمونه‌ای از RecyclerView را با استفاده از findViewById دریافت کنید.
  2. یک LayoutManager بسازید و به RecyclerView اختصاص دهید.
  3. یک نمونه از آداپتور بسازید و داده‌ها را به آن بدهید.
  4. آداپتور را با متد setAdapter به RecyclerView متصل کنید.

📝 خلاصه نکات کلیدی

✅ عملکرد بالا: RecyclerView فقط ویوهای قابل مشاهده را در حافظه نگه می‌دارد و آیتم‌های خارج از کادر را بازیافت می‌کند.

✅ جداسازی مسئولیت‌ها: جدا کردن منطق چیدمان (LayoutManager)، ظاهر (Adapter/ViewHolder) و انیمیشن (ItemAnimator) باعث کدنویسی تمیزتر و ماژولارتر می‌شود.

✅ الگوی ViewHolder: استفاده از ViewHolder ضروری است تا از فراخوانی مکرر findViewById جلوگیری شود و عملکرد لیست بهینه گردد.

✅ انعطاف‌پذیری: با تغییر LayoutManager می‌توان همان لیست را هم به صورت لیستی و هم به صورت شبکه‌ای نمایش داد بدون تغییر در منطق آداپتور.

✅ مدیریت رویدادها: برای پاسخ به کلیک روی آیتم‌ها، باید از RecyclerView.OnItemTouchListener یا کلیک در داخل متد onBindViewHolder آداپتور استفاده کرد.


❓ سوالات تمرینی پایان فصل

۱. تفاوت اصلی بین ListView و RecyclerView را از نظر مدیریت حافظه و عملکرد توضیح دهید.

۲. چرا استفاده از الگوی ViewHolder در آداپتورهای RecyclerView ضروری است؟ اگر از آن استفاده نکنیم چه مشکلی پیش می‌آید؟

۳. اگر بخواهید لیستی را که شامل آیتم‌هایی با ارتفاع‌های متغیر و نامنظم است (مانند پست‌های شبکه اجتماعی) ایجاد کنید، کدام LayoutManager مناسب‌تر است و چرا؟

۴. نقش ItemDecoration در RecyclerView چیست؟ آیا می‌توان بدون استفاده از آن، بین آیتم‌ها فاصله ایجاد کرد؟ توضیح دهید.

۵. در متد onBindViewHolder، اگر داده‌های لیست در حین اسکرول تغییر کنند، چه کاری باید انجام دهید تا تغییرات در UI اعمال شود؟

۶. چگونه می‌توانیم انیمیشن پیش‌فرض افزودن و حذف آیتم‌ها را غیرفعال یا سفارشی‌سازی کنیم؟

درس متنی 3/13
در حال مشاهده
جلسه 3 نمایش فهرست ها با Recycler View