طریقه لود کردن موارد لیست ویو به صورت Lazy از سرور اصولی
سلام دوستان
من برای پروژه ام نیاز دارم تقریبا چیزی شبیه صفحه سوالات همین سایت رو توی برنامه اندرویدم پیاده کنم.
مثلا یه لیسته که 20 تا مورد از سرور لود میکنه و وقتی به انتهای 20 تا میرسیم قراره 20 تای دیگه از سرور لود بشه.
تا اینجای کار مشکلی نیست! مشکل از اونجایی پیش میاد که مثلا قراره این لیست از سرور بر اساس محبوبیت لود بشه. حالا فرض کنید 20 تای اول رو درخواست دادیم به سرور و گرفتیم. حالا 10 دقیقه بعد باید 20 تای بعدی رو لود کنیم اما ممکنه تو همین 10 دقیقه این محبوبیت ها تغییر کرده باشن و مثلا اونی که رتبه 15 رو داشته الان رتبه 25 رو داره پس اگه به سرور بگم بر اساس محبوبیت از شماره 20 تا 40 رو بهم بده ، یه داده تکراری تو کارم میاد.
همین ماجرا به صورت برعکسشم هست یعنی ممکنه تو اون 10 دقیقه رتبه یه مورد از 25 بشه 15 . اینجوری اصلا اون مورد لود نمیشه و نادیده گرفته میشه.
میخواستم ببینم شما راهی برای این مشکل سراغ دارید؟
از اونجایی که استاد هم خودشون برای این سایت این مورد رو پیاده سازی کردن میخواستم ازشون بخوام ایشون هم در این باره راهنمایی کنن.
با تشکر از همگی :)
سلام .
شما برای انجام اینکار باید هم متد های سرور رو با یه روش خاص بگیری هم درخواست ارسالیت رو باید یه طور خاصی بفرستی که اینطور خاص این طور میباشد :
شما متد های سرور رو به این صورت میگید اطلاعات رو بدن که :
$part = $_REQUEST['part'];
$start = $part * 10;
$end = $start + 10;
این مقدار بالا برای پارت بندی بسته های ارسالی از سرور هست که میگیم چه تعداد رو نمایش بده که در دستور sql به شکل زیر استفاده میشه :
select id, title from my_table where isActive=1 ORDER BY id DESC LIMIT $start ,$end ;
خوب این از سرور میریم سراغ کلاینت ، شما توی کلاینت هم در قسمت ادپتر لیست ویو تعداد آیتم های ArrayList رو میگیرید و منهای مثلا 3 میکنید . این منهای 3 رو بعدا میگم چیه .
int itemCount = lists.size() - 3;
بعد براش یه لیسنر هم مینویسید داخل متد فیل که به صورت زیر هست :
if (itemCount == position) {
OnPartChangeListener.onPartChange(position);
}
خوب اون منهای 3 بالا برای این هست که بگیم هروقت کاربر سومین آیتم از آخر رو دید لیست جدید بیاد ، که عددش دلخواه هست میتونید هم منها نکنید و بگید هر وقت به ته لیست رسید خبرش کن.
خوب یکم دیگه کار داره اونم مربوط به قسمت ارتباط با سرور هست . زمانی که میخواید درخواست رو به سرور بفرستید یه مقدارم میفرستید که شماره پارتی هست که سرور باید بهتون بده که از 0 شروع میشه و میره به بالا
توجه داشته باشید که هر بار که کلاینت موفق شد اطلاعات رو به طور کامل از سرور بخونه متغیر پارتتون رو + 1 کنید تا در مرحله بعدی پارت جدید رو بگیرید.
لازم به توضیح هم نیست لیسنر بالا هر وقت صدا زده شد باید درخواست به سرور فرستاده بشه .
سلام دوستان
کسی راه حلی برای این مساله پیدا نکرد؟
منم به یه مشکل این چنینی دچارم. یه اپلیکیشن مثل دیوار را درنظر بگیرید که هر لحظه داره محصول داخلش ثبت میشه. و محصولات را هم بر اساس زمان ثبت به صورت lazy از سرور میگیره و نشون میده.
حالا اگه کوئری را طوری بنویسیم که ابتدا رکوردها را بر اساس زمان ثبت مرتب کنه و سپس با تکنیک lazy به صورت 10تا 10تا بگیره محصولی که الان داره توی لیست 10تایی اول که از سرور گرفته شده نشون داده میشه چند لحظه بعد با اضافه شدن محصول های جدید جایگاهش تغییر کرده و ممکنه توی لیست 10تایی سومی که از سرور میاد باشه و همین مشکل تکرار محصول پیش میاد.
این مشکل را باید چطور حل کرد؟ من چندین روزه درگیرشم و نتونستم حلش کنم
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .