۴ محمدصادق صرافیان
onCreateViewholder
پوریا شفیعی حل شده توسط پوریا شفیعی

سلام سلام

وقتی ما 20 تا ایتم داریم ، 20بار هم متد oncreateviewholder صدا زده میشه واجرا میشه، حالا کی قضیه reuse اتفاق میفته ؟ 

سلام و وقت بخیر 

وقتی شما ۲۰ آیتم داشته باشید ۲۰ بار متد oncreateviewholder صدا زده نمیشود 

بلکه این متد به تعداد آیتم‌های هنگام اضافه کردن یک ریسایکر ویو صدا زده میشود اما این یعنی چی؟

در عکسی که پیوست کردم زمانی هست که ما یک RecyclerView  رو به اکتیویتی یا فرگمنت مربوطه اضافه کردیم و تعداد نمایش آیتم‌ها ۹ عدد هست پس متد oncreateviewholder فقط ۹ بار صدا زده میشه (میتونین لاگ بگیرین و این مورد رو مشاهده بفرمایید)

و کال شدن متد oncreateviewholder تا زمانی ادامه خواهد داشت که شما اسکرول کنین و این ۹ آیتم وارد صفحه شوند به عبارتی inflate شوند

نکته : اگر آیتمی تکراری وارد صفحه شود این متد دیگر کال نخواهد شد

حال اگر عمل اسکرول رو برگردانید خواهید دید دیگر متد oncreateviewholder کال نخواهد شد 

اما متد  onBindViewHolder  از همان ابتدای کار (شروع اسکرول تا انتهای اسکرول یعنی اخرین آیتم صدا زده میشود) و به طور ساده عرض کنم  مادامی که آیتمی وارد صفحه شود (عمل بازیافت) این متد یعنی onBindViewHolder صدا زده خواهد شد.(بر خلاف متد onCreateViewHolder )

حتما خودتون log بگیرید و تست کنین و به این صحبت اکتفا نفرمایید 

پیروز باشین

 

پوریا شفیعی ۳۰ خرداد ۱۳۹۹، ۱۰:۰۸

پوریا سلام

من لاگ گرفتم و دیدم مثلا وقتی کلا 20تا ایتم داریم ، ولی 7تا ایتم در صفحه قابل نمایش هست، همون 7بار (8بار) این oncreate صدا زده میشه، وقتی اسکرول می‌کنیم به پایین دوباره صدا زده میشه و به اندازه 20بار صدا زده میشه تا واسه همه ایتم‌ها ساخته بشه و 20بار عمل inflate کردن انجام میشه،اما بعدش دیگه موقع اسکرول کردن‌های تکراری دیگه صدا زده نمیشه، حالا اینکه چه زمانی این ایتم اولی میاد جای هشتمی میشینه رو درک نمی‌کنم ..

نمی دونم شاید مطلب رو نگرفتم . 

محمدصادق صرافیان ۳۰ خرداد ۱۳۹۹، ۱۲:۲۹

 درسته.اول پیشنهاد من این هست اولین جلسه همین سر فصل که به صورت پاورپوینت عمل بازیافت توضیح داده شده رو  دوباره ببینی  (چون به صورت تصویری جواب اونجاست و همچنین بحث ریساکلر ویو بسیااااااار مهمه و توی همه پروژه‌ها تا الان بوده )
اما متنی:فرض کن صف نونوایی داریم که هر کی نون گرفت این از صف خارج میشه  و *دوباره به انتهای صف میره تا این عمل بازیافت انجام شه (فرض کن هشت نفر در صف باشن پس آیتم اول میره و جای نفر هشتم قرار میگیره که دوباره نون بگیره )
دقیقا همچین چیز ای رو ما در آداپتر داریم که وقتی آیتمی نون شو گرفت نمیره خونه بلکه به انتهای صف میره تا دوباره نون بگیره  و این عمل مادامی ادامه پیدا میکنه که کاربر اسکرول نکنه و یا از اپ خارج بشه.
در ابتدای کار و برای اولین بار وقتی فردی نونشو گرفت هم متد onCreateViewHolder , هم onBindViewHolder صدا زده میشود 
ولی از دفعه دوم به بعد فقط متد onBindViewHolder صدا زده میشود.(که این نیاز مند اسکرول کاربر هست)

صرفا هم این مثال رو زدم تا درک بهتری داشته باشی 

امدیوارم مثال خوبی بوده باشه 

 

بهترین پاسخ
پوریا شفیعی ۳۰ خرداد ۱۳۹۹، ۱۸:۱۰

سلام آقا پوریا. روزت پر از کدهای تمیز و درست و بدون باگ پسر.

 

 پاورپوینت اولین جلسه همین سر فصل که به صورت عمل بازیافت توضیح داده شده کجاست؟ که شما توی پاسخ به این سئوال مطرح کردی.

پژمان آزاد ۱۶ تیر ۱۳۹۹، ۱۳:۱۹