irlogcat / Android-FAQ

Android - Frequently Asked Question
48 stars 3 forks source link

‫تفاوت ریسایکلر Recycler و لیست ویو ListView ؟ #151

Open FatemehKavoosi opened 4 years ago

Sanaebadi97 commented 4 years ago
### **ViewHolder** ریسایکلر ویو از الگو ویوهولدر استفاده می کند که در لیست ویو اجباری نیست . ریسایکلر ویو هنگام اسکرول سلول ها را بازیابی می کند . الگو ViewHolder چیست ؟! یک ابجکت ویو هولدر ویو های کامپونتتی را درون یک لی اوت تگ دار ذخیره می کند و تنها یک بار آن ها را با findViewById فرخوانی می کنیم و در بارهای بعد فقط آن ویو بازیابی می شوند در حالی که لیست ویو بارها و بارها هنگام اسکرول findViewById را تکرار می کند و این عمل سرعت را پایین می اورد . **### LayoutMamager** در لیست ویو تنها نوع ویو ای که در دسترس است به صورت عمودی است اما ریسایکلر ویو لیست را از container خود ریسایکلر ویو جدا رکرده از این رو شما می توانید آیتم ها را در هنگام اجرا در کانییر های مختلف grid or linear ‌توسط لیوت منیجر نمایش دهید . **### ‫‪Item‬‬ ‫‪Animator‬‬** لیست ویو انمیشن های زیادی را پشتیبانی نمی کتد اما ریسایکلر ویو بعد دیگری را وارد ماجرا کرده .
hosseiniSeyRo commented 3 years ago

ListView ویجت قدیمی خوبی بود برای ایجاد لیستی از اجزا که قابلیت Scroll را داشتند و از api 1 قابل استفاده بود ولی مشکل بزرگش پشتیبانی نکردن از اسکرول به صورت Horizontal بود شاید کابوس برنامه نویس ها در زمان خودش بود و از نظر طراحی رابط کاربری اصلا smooth نبود. RecyclerView همراه با Android Lollipop عرضه شد کلی از باگ هایی که در ListView وجود داشت و باعث می شود برنامه نویس ها را کلافه کنه در RecyclerView حل شد تمامی بخش ها در RecyclerView استاندارد سازی شد به گونه ای با استفاده از RecyclerView هیجوقت خطای Memory Leak در لیست اتفاق نخواهد افتاد.

۵ دلیل وجود دارد که از RecyclerView به جای ListView استفاده کنید که در ادامه آنها را باهم بررسی می کنیم.

ViewHolder ViewHolder pattern یکی از ویژگی های RecyclerView است یک از ویژگی های ViewHolder pattern ایجاد لیست smooth است و دلیل دوم عمل findviewbyid تنها چندبار اتفاق می افتد نه به تعداد آیتم های لیست ما.

LayoutManager یک دیگر از ویژگی های فوق العاده RecycelrView وجود LayoutManager است که باعث می شود به هرشکلی که بخواهید آیتم های خود را نمایش دهید به صورت افقی عمودی بقل هم به شکل دوتایی سه تایی و… ItemDecoration ویژگی فوق العاده جالبی که در RecyclerView به شکل کد وجود دارد پشتیبانی از Divider یا جداکننده سفارشی است (به صورت پیشفرض جدا کننده در RecyclerView وجود ندارد) ولی با استفاده از Extend از کلاس ItemDecoration به راحتی می توان جداکننده سفارشی طراحی کرد. شاید بگید چرا همچین کاری باید کرد می توان در layout مربوط به هر آیتم یک جداکننده به صورت عکس یا کد xml قرار داد تفاوت کد اصلی با عکس در این است که آیتم آخر نیاز به Divider ندارد در صورتی که با کد این کار انجام شود در آخرین View دیگر Divider وجود نخواهد داشت (هر چیزی اصولیش خوبه ☺) ItemAnimator یک دیگر از فوق العاده ترین ویژگی های RecyclerView پشتیانی از ItemAnimator است همانطور که از نام آن پیداست برای ایجاد انیمیشن بروی آیتم های مختلفی است اگر خواسته باشید بروی ListView انیمیشن قرار دهید خواهید دید چقدر عذاب آورد خواهد بود ولی به راحتی در اینجا می توان انیمیشن را به ItemAnimator داد و به ازای هر آیتم انیمیشن را مشاهده کرد. Notifying adapter شاید تنها ویژگی که RecyclerView را از ListView متمایز کند استفاده از notify های مختلف باشد در ListView فقط یک Event به نام notifyDataSetChanged وجود داشت و این زمانی اتفاق می افتاد که داده تغییر کرده باشد مثلا یک آیتم به لیست اضافه شده باشد ولی در RecyclerView علاوه بر notifyDataSetChanged دو ویژگی notifyItemInserted(), notifyItemRemoved() وجود دارد که در زمانی که بخواهیم انیمیشن را نمایش دهیم به کار می آید به طور متوجه می شویم داده حذف شده است انیمیشن x لود شود متوجه می شویم داده اضافه شده است انیمیشن x لود شود. کاربران فعلی دنبال لیستی میگردند که کمی واکنش گرا باشد صادقانه بخواهیم بگویم ListView اصلا برای طراحی متریال دیزاین طراحی نشده است ولی در عوض با RecyclerView هرکاری که بخواهید می توان کرد شاید بگید پیاده سازی و استفاده از RecyclerView کمی سخت باشد ولی اگر کمی دقت کنید متوجه می شوید اگر RecyclerView خطایی داشته حل شده و اگر پیاده سازی آن سخت است (هرچند که نیست) به خاطر وجود بخش های مختلف آن است. مزایای RecyclerView استفاده از الگوی ViewHolder smooth تر نسبت به ListView طراحی متریال سرعت بالاتر استفاده بهینه از Memory عدم خطای Memory Leak پشتیانی از OnItemTouchListener که در ListView وجود ندارد. ایجاد Event برای اسکرول قابل سفارشی سازی و… معایب RecyclerView پیچیدگی پیاده سازی هیچی مزایای ListView سادگی پیاده سازی پشتبانی از الگوی ViewHolder (اما هیچوقت کسی برای ListView پیاده سازی نکرده است چون RecyclerView به صورت پیشفرض از آن پشتیبانی می کند) قابل سفارشی سازی معایب ListView استفاده زیاد از Memory ایجاد خطای Memory Leak در view های پیچیده عدم پشتیانی از کلیک های مختلف مثل OnTouch عدم پیاده سازی انیمیشن برای حالت های مختلف مثل حذف و درج [منبع](https://programchi.ir/2018/08/25/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-recyclerview-%D9%88-listview/ )
hosseiniSeyRo commented 3 years ago

خوندم این جواب هم میتونه مفید باشه: https://stackoverflow.com/a/28886129/5869630