نکته های پیشرفته در مورد RecyclerView

با سلام، پس از مطلبی که به معرفی RecyclerView در اندروید پرداختم، تو این پست میخوام تعدادی از نکات پیشرفته از RecyclerView را با توجه به سایت AndroidDev براتون به اشتراک بگذارم.

نکته اول:

هر گاه آیتم recycler view سایز فرزندانش را در هنگام runtime تغییر نمی دهد، ویژگی setHasFixedSize را با مقدار true انتخاب کنید: recyclerView.setHasFixedSize(true)

با انحام این کار recyclerview هرگاه که داده در آیتم recyclerview بروزرسانی شده است از layout درخواستی نخواهد کرد و view توسط خودش invalidate می شود.

نکته دوم:

مقدار item click listener داخل onCreateViewHolder را تنظیم (Set) کنید.

هر زمان که کاربر روی هر آیتمی کلیک می کند، viewHolder موقعیت adapter که در آنجا عمل کلیک انجام شده است را می گیرد( vh.getAdapterPosition() ). این مهمه چرا که آیتم می توانند توسط adapter حرکت کرده و  View های مورد نظر rebound نمی شوند. پس توسط زمانی که محدود می شود، میتونه بگه موقعیت 2، اما زمانی که کاربر آن را کلیک کند، ممکن تو موفعیت 5 باشه. پس با استفاده از  vh.getAdapterPosition() اطمینان پیدا می کنیم که index درست برگشت (return) داده می شود

نکته سوم:

زمانی که از نوع های مختلف view استفاده می شود، id مرتبط با layout ها را return کنید.(برای مثال:R.layout.view_one )

اگر adapter تان انواع مختلفی view دارد، سپس getItemViewType و onCreateViewHolder چیزی شبیه زیر خواهند بود. شما باید یک swich case داخل onCreateViewHolder بنویسید تا layout مناسب را inflate کند.

recyclerView در اندروید

 

بنابراین به جای اینکه type ها را برگشت (return) دهید. این کد boilerplate را از  onCreateViewHolder همانند زیر، حذف خواهد کرد.

 

این ترفند نمی تواند همیشه استفاده شود، زیرا گاهی اوقات شما به آیتمی درون  layout ای که برای use case متفاوتی inflate شده نیاز دارید در صورتی که مورد برای شما نیست ، برگشت دادن id راه حل مدیریت type ها مختلف view ها هست.

نکته چهارم:

برای اضافه کردن داده به recyclerView از DiffUtil  استفاده کنید.

هرگاه که داده درون recyclerView تغییر کند، اکثر توسعه دهنده ها  notifyDataSetChanged() را فراخوانی می کنند تا داده جدید را روی UI نمایش دهند. چیز که اونها تو فهمش دچار اشتباه شدند اینه که این عمل بسیار پر هزینه است و دقیقا همینجاست که DiffUtil به نجات دادنمان میاد.

DiffUtil یک Utility class خست که می تونه تفاوت های بیت دو  لیست را محاسبه کند و لیستی از عملیات بروزرسانی که لیست اولی را به لیست دومی تبدیل می کند، نمایش دهد. میتونه برای محسابه بروزرسانی های recyclerView Adapter استفاده شود. برای استفاده از DiffUtil باید “DiffUtil.Callback” را پیاده سازی کرد که اندکی متود داره (پایین نشان داده شده) که باید منطق DiffUtil را جهت کار کردن فراهم کنید.

Recyclerview DiffUtil methods