Recyclerview همراه با pagination در اندروید

در این مقاله میخوام آموزش بدم که چطوری داده ها رو صفحه به صفحه در recyclerview نمایش بدیم و همینطور که داریم اسکرول میکنیم و منتظر داده های صفحه جدید هستیم loading هم نشون بدیم. خیلی از آموزش ها رو دیدم که تو پیاده سازی pagination برای recyclerview از متد notifyDataSetChanded استفاده کردن. این کار پرفورمنس رو پایین میاره چون وقتی ما دیتای صفحه جدید رو میگیریم لازم نیست کل recyclerview رو آپدیت کنیم بلکه فقط کافیه دیتای جدید رو بهش اضافه کنیم به همین خاطر توی این آموزش من از notifyItemInserted استفاده کردم که پرفورمنس بهتر بشه.

این آموزش به مراحل زیر تقسیم میشه

  • اضافه کردن یک activity که توی layout اش یک recyclerview داره
  • اضافه کردن کلاس EndlessRecyclerOnScrollListener
  • آماده کردن دیتای فیک جهت نمایش در recyclerview
  • ساختن adapter و layout برای سطرهای recyclerview

برای سایت یک repository تو گیت هاب درست کردم. این repository شامل پروژه ای به اسم freeSampleCode هست که قصد دارم کل آموزش ها رو توی این پروژه اضافه کنم. در حال حاضر یک پکیج به اسم recyclerview اضافه کردم که داخلش پکیج دیگری به اسم endless هست که کدهای این آموزش داخل اون قرار داره. توی این آموزش فرض رو بر این قرار دادم که دوستان با recyclerview آشنا هستند و میدونن که چطوری میشه یک سری داده رو با recyclerview نمایش داد. کسانی هم که آشنایی ندارن میتونن کد رو در گیت هاب بخونن و راحت متوجه بشن. همونطور که میدونید یکی از راههای پیشرفت توی برنامه نویسی خواندن کد هست 🙂

ویدیوی زیر نتیحه نهایی این مقاله رو نشون میده.

کدهای این آموزش رو میتونید از طریق لینک زیر مشاهده کنید و همینطور میتونید پروژه رو clone کرده و اجرا کنید و نتیجه رو مشاهده کنید.

لینک گیت هاب برای دیدن فایل های پروژه مربوط به این مقاله

بررسی کلاس EndlessRecyclerActivity

قسمت اصلی این آموزش در کلاس EndlessRecyclerActiviy اتفاق می افتد. قسمتهای مهم این کلاس رو در ادامه توضیح میدم.

 

من اینطوری در نظر گرفتم که هر آیتم recyclerview یک خبر رو نشون میده که دو قسمت title و body داره. یک فایل با عنوان news.json توی پوشه asset گذاشتم که شامل دیتای فیک هست. توی این آموزش من دیتای recyclerview رو از فایل news.json میخونم و با sleep کردن thread ای که دیتا رو از فایل میخونه گرفتن داده از نت رو شبیه سازی کردم. دلیل اصلی اینکه توی این آموزش دیتا رو از نت نگرفتم این بوده که خواستم روی مساله پیاده سازی pagination برای recyclerview تمرکز کنم.  قسمت مهمی که در متد onCreate وجود دارد خط ۱۴ است که یک نمونه از کلاس ScrollListener برای متد addOnScrollListener ست میشود. کلاس ScrollListener از کلاس EndlessRecyclerOnScrollListener ارث میبرد و کلاس EndlessRecyclerOnScrollListener هم از کلاس RecyclerView.OnScrollListener ارث میبرد. برای متد addOnScrollListener حتما باید یک نمونه از کلاس RecyclerView.OnScrollListener ست شود. این کار باعث میشود که هر زمان عمل اسکرول روی recyclerview اتفاق افتاد متد onScrolled کلاس مربوطه صدا زده شود.

کلاس EndlessRecyclerOnScrollListener

در کلاس EndlessRecyclerOnScrollListener مقدار visibleThreshold برابر با ۵ در نظر گرفته شده است. این مقدار بدین معنی است که هر زمان ما داریم اسکرول میکنیم اگر ۵ تا آیتم تا انتهای recyclerview فاصله داشتیم متد onLoadMore اجرا شود و برود دیتای صفحه بعدی رو بگیرد. کلاس EndlessRecyclerOnScrollListener رو شما میتونید توی هر پروژه ای که recyclerview دارد و احتیاج به pagination هست استفاده کنید. تنها کافی است که در هر پروژه، یک کلاس بنویسید که این کلاس رو extend کنه و متد onLoadMore اون رو پیاده سازی کنه. برای مثال در این پروژه من کلاس ScrollListener  رو ساختم که این کلاس رو extend کرده که کدش به صورت زیر است.

متد simulateGetItemFromNet رو شما میتونید با هر کدی که قراره دیتای صفحه جدید رو بگیره جایگزین کنید. من توی این متد یک ترد بک گراند اجرا کردم که ۳ ثانیه صبر میکنه و بعد دیتای صفحه جدید رو برمیگردونه. دیتای برگردونده شده به متد showNews پاس داده میشه این متد دیتای جدید رو به لیست اضافه میکنه و بعد متد notifyItemInserted رو فراخوانی میکنه. ایندکسی که به متد notifyItemInserted پاس داده میشه سایز لیست قبل از اضافه شدن دیتای صفحه جدید است. توی این پروژه صفحه بندی از شماره یک شروع میشه. هر زمان که اسکرول اتفاق میوفته متد onLoadMore با شماره صفحه جدید که نسبت به قبل یکی بیشتر شده فراخوانی میشه.

بررسی کلاس NewsAdapter

کد این کلاس رو در زیر آوردم.

 

یک نکته مهم این است که ما باید در adapter تعداد آیتم ها رو یکی بیشتر برگردونیم که آخرین آیتم برای نمایش loading استفاده میشود. امیدوارم از این آموزش استفاده لازم رو برده باشید منتظر نظرات شما عزیران هستم. 🙂

درباره نویسنده

پست های مرتبط

2 نظر

پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

10 − 8 =