بهینه سازی RecyclerView


مهاجرت از ListView به RecyclerView یکی از مهم‌ترین تغییرات انقلابی در برنامه‌نویسی اندروید محسوب می‌شود. RecyclerView یک ابزار بسیار قوی و قابل انعطاف برای نمایش داده‌های زیاد و پیچیده به صورت لیست است. اکثر اپ‌ها، حداقل یک صفحه دارای لیست برای نمایش تعدادی داده‌ دارند (مانند محصولات یک فروشگاه) و این لیست‌ها ابزاری اجتناب‌ناپذیر در برنامه‌نویسی اندروید به شمار می‌روند.

گاهی اوقات RecyclerView نمی‌تواند نیاز مورد نظر ما را برطرف کند یا معمولا لگ‌هایی دارد که برای کاربر اذیت‌کننده است. RecyclerView تقریبا کامل بهینه شده است، اما نکاتی برای بهینه ساختن لیست وجود دارد که معمولا در نظر گرفته نمی‌شود. این موضوع موجب ایجاد مشکلات یا گیر کردن هنگام اسکرول لیست می‌شود.در این مقاله 6 مورد از این نکات را با هم مرور می‌کنیم.



1- از لایه‌های پیچیده، کمتر استفاده کنید

لایه‌هایی مانند Nested Views یا RelativeLayout از لحاظ پردازشی بسیار سنگین هستند. زمانی‌که تعداد آیتم‌های نمایش داده شده در صفحه زیاد باشد با یک لگ ملموس مواجه می‌شوید. ترجیحا از ViewGroup هایی مانند FrameLayout و LinearLayout استفاده کنید زیرا کمترین هزینه برای رندر و ساخت را دارند. اگر لایه پیچیده دارید و این لایه‌ها جوابگو نبودند باید از ConstraintLayout (در AndroidX معرفی شده) استفاده کنید زیرا این ViewGroup برای لایه‌های پیچیده بهینه‌سازی شده است.

میزان پیچیدگی لایه ها و البته میزان سنگینی هر لایه - منبع: کنفرانس goto;
میزان پیچیدگی لایه ها و البته میزان سنگینی هر لایه - منبع: کنفرانس goto;


2- از لایه‌هایی با ارتفاع ثابت و یکسان استفاده کنید

اگر این امکان را دارید، از لایه هایی با ارتفاع ثابت استفاده کنید. سپس این تکه کد را اضافه کنید.


3- از متد‌های cache و DrawingCache خود RecyclerView استفاده کنید

" اگر می‌خواهید آیتم‌ها زمانی‌که از صفحه خارج شدند کش شوند باید بر اساس تعداد آیتم‌ها عدد را تغییر دهید."


4- عکس‌ها را بهینه کنید

اکثر مشکل‌ها و لگ‌هایی که در RecyclerView موجب رنجش کاربر می‌شوند، مربوط به حجم بالای عکس‌های آیتم‌هاست. اگر عکس‌ها را از داخل خود اپ لود می‌کنید باید مطمئن شوید که حجم عکس‌ها را پایین آورده‌اید. در غیر این صورت اگر عکس‌ها را از سمت سرور لود می‌کنید باید با استفاده از چند خط کد، نمایش عکس‌ها را با کیفیت و حجم کمتر در آیتم‌ها نمایش دهید.

اگر از کتابخانه هایی مثل Picasso و یا Glide استفاده می‌کنید، می‌توانید به مانند زیر عکس ها را بهینه تر کنید.

* می‌توانید تک‌تک این متد ها را آزمایش کنید و بر اساس نیاز انتخاب و استفاده کنید

و اگر به صورت مستقیم و بدون استفاده از کتابخانه خاصی عکس‌ها را نمایش می‌دهید، از این تک کد استفاده کنید.


5- متد onBindViewHolder را بسیار کوچک نگه دارید و کلیک‌ها را در متد onCreateViewHolder هندل کنید

در هر بار ایجاد آیتم در آداپتر، متد های ClickListener هر بار ایجاد می‌شوند بنابراین متد کلیک خود را در متد onCreateViewHolder بسازید تا از ایجاد چندین باره آن خودداری کنید.

6- هنگام تغییر داده‌ها در لیست RecyclerView ، فقط آیتم‌های تغییر یافته را Refresh کنید

شما می‌توانید به جای رفرش‌کردن کل لیست از متد‌های تغییر برای یک یا چند آیتم خاص استفاده کنید. متد notifyDataSetChanged را نیز به عنوان راه‌حل نهایی در نظر داشته باشید.

شما می‌توانید در صورت نیاز مبرم به استفاده از متد notifyDataSetChanged، با استفاده از تکه کد زیر موجب ثابت نگه‌داشتن آیتم‌ها هنگام رفرش کل RecyclerView شوید.

اگر شما هم روش‌های دیگری برای بهینه سازی سراغ دارید با من در کامنت‌ها به اشتراک بگذارید.