برای پروژه ای مجبور بودم از تعداد زیادی لیست استفاده کنم.تقریبا در هر صفحه یک لیست برای نمایش داشتم که با صفحههای دیگر شباهت داشت.اول تصمیم گرفتم که یک کلاس Adapter بسازم و تمام Adapter ها از این کلاس ارث بری کنند و هربار خواستم RecyclerView بسازم،داخل کد جاوا Adapter مربوطه رو new کنم و ادامه ماجرا...
با خودم گفتم جالب میشه اگه خود RecyclerView میتوست دیتا مورد نظر رو پیدا کنه و لازم نباشه داخل کد جاوا بهش دیتا بدیم.یعنی داخل خود تگ RecyclerView داخل کد xml مسیر دیتا رو بهش میدادیم و لیست پر میشد و دیگه لازم نبود داخل اکتیویتی RecyclerView رو پیدا کنیم و لیست مربوطه رو بهش پاس بدیم.
پس تصمیم گرفتم یک CustomRecyclerView بسازم که مسیر مورد نظر برای تولید دیتا رو بگیره و لیست پر بشه.با این کار خیلی کارم سریع میشد.فقط تگ رو اضافه میکردم و آدرس یک متد رو بهش میدادم و هروقت اکتیویتی اجرا میشد لیست پر شده و درست اجرا میشد.پس دست به کار شدم.در ادامه یک نمونه ساده از نحوه پیاده سازی رو برای دوستان مینویسم.
داخل پوشه values یک فایل با نام attrs.xml ایجاد میکنیم و بصورت زیر ویژگیهای موردنظر روبهش میدیم.این ویژگیها زمانی که از تگ میخواهیم استفاده کنیم،قابل دسترسی هستند و مشابه width یا هر ویژگی دیگهای میباشند.
در این مرحله یک adapter ساخته و براساس طرح مورد نظر ViewHolder و Layout را طراحی کنید.
در این مرحله یک کلاس به اسم DataProvider ساختم که متدی با نام getRows داره که برای ما دیتا و آیتم های مورد نظر برای نمایش در لیست را تولید میکند.در تصویر زیر یک نمونه ازین متد که فقط لیستی از رشته ها تولید میکند رو میتونید ببینید.
حالا بخش اصلی کارمون شروع میشه.یک کلاس با نام CustomRecyclerView میسازیم که از کلاس RecyclerView ارث بری کرده است.همچنین یک متد به اسم render ساختم که مراحل خواندن ویژگی ها و دیتا را انجام دهد.
ابتدا با گرفتن متن برگشتی از ویژگی dataBinder و جدا کردن آن، نام کلاس و متد مورد نظر برای گرفتن دیتا را بدست آوردم.
در قدم بعدی با استفاده ازReflection کلاس و متد مورد نظر رو پیدا کردم و متد رو صدا زدم و خروجی متد رو داخل یک لیست از جنس رشته ریختم.
در نهایت Adapter را که ساخته بودم با این لیست پر کردم.
حالا وقتشه که این تگ رو به xml اضافه کنم.پس به layout مورد نظر میرم و این تگ رو به صورت زیر اضافه میکنم و در قسمت dataBinder بصورت زیر آدرس کلاس و متد رو میدهم و در قسمت packageName آدرس پکیج که کلاس درون آن قرار دارد:
app:dataBinder="DataProvider/getRows" app:packageName="com.eliasmohammadi.customrecyclerview.Model"
وقتی برنامه رو اجرا کنیم،میبینیم که بدون اینکه داخل MainActivity کدی نوشته باشیم،لیست ما پر میشه و نمایش داده میشه.خروجی برنامه را در تصویر زیر رو ببینید:
در پایان دوستان اگر تجربه مشابهی دارید،ممنون میشم با من به اشتراک بذارید.در ضمن لینک سورس پروژه این مقاله رو میتونید از گیت هاب من به آدرس زیر دریافت کنید.ممنون از توجه شما https://github.com/eliasMohammady/CustomRecyclerView_virgool