بروزرسانی خودکار لیست ویو در پروژه مارکت
با سلام خدمت دوستان گرامی
استاد در این قسمت از آموزش (قسمت 16-4) برای بروزرسانی خودکار لیست ویو بعد از هر دانلود از HashMap استفاده کردند و همانطور که می دانید در قسمت ساخت پروژه Image Optimization از دستور :
adapter.notifyDataSetChanged
استفاده کردند البته ذکر کردند که این راه حل قطعی و معقول نیست.
این طور که من در روش HashMap متوجه شدم ، هنگامی که می خواهیم عکسی را برای دانلود به Download Manager ارسال کنیم ،اسم آن عکس و Image View مربوط به آن را نیز با استفاده از دستور زیر داخل HashMap قرار می دهید :
imageMap.put(imgLogo, fileName);
وبعد از دانلود هر عکس ،key ها که همان Image View ها هستند را از HashMap بیرون می کشیم و در یک Set (آرایه ای که عنصر تکراری در آن قرار نمی گیرد) میریزیم و بعد با استفاده از اسم عکسی که دانلود شده به دنبال Image View مربوط به آن می گردیم
و بعد عکس دانلود شده را بر روی آن قرار می دهیم.
(البته امیدوارم که درست برداشت کرده باشم)
حال 2 تا سوال دارم :
1- استاد در دقیقه 52 فیلم جابه جایی زیر را انجام دادند و گفتند این کار برای جلوگیری از مشکل است و کمی هم توضیح دادند اما راستش من هیچی نفهمیدم.
لطفا توضیح دهید.

2- بهتر نیست به جای این همه کار از همان دستور :
adapter.notifyDataSetChanged
استفاده کنیم؟ مگر اشکال این دستور چیست؟
(البته خودم فکر کنم به خاطر اینه که بعد از هر دانلود کل لیست ویو refresh میشه , شاید این کار منطقی نباشد)
درضمن قبل از درج سوال،سوالات مرتبط را گشتم اما چندان جواب مرتبطی پیدا نکردم
باتشکر
سلام
1. فرض کنید که الان 7 تا الوار (از listView) دارید توی صفحه نمایش میبینید؛ حالا Scroll میکنید تا item هشتم نمایش داده بشه.
به محض این که item هشتم وارد صفحه شد متد fill از کلاس AdapterApplication براش اجرا میشه که توی این متد میاد و به این قسمت میرسه
String filename = HelperString.getFileNameWithExtension(item.logoUrl);
final File imageFile = new File(G.DIR_FINAL + "/" + filename);
if ( !imageFile.exists()) {
imgLogo.setImageBitmap(null);
DownloadManager.addToDownloadList(item.logoUrl, imgLogo);
}
.....
حالا که رسید به این قسمت میبینه که فایل مربوط به imgLogo خودش هنوز دانلود نشده، پس وارد قسمت if میشه و توی if هم تابع addToDownloadList از کلاس DownloadManager فراخوانی میشه.
خوب تا اینجا که هیچ مشکلی نیست. حالا میخوایم ببینیم چرا استاد اون دو خط رو جابجا کرده:
الان شما دوباره اگه رو به پایین scroll کنید و item هشتم از صفحه بره بیرون و دوباره Scroll کنید و بیاریدش توی صفحه بازم وارد قسمت if (همون چند خط کد بالا ) میشه ولی این بار که وارد تابع addToDownloadList میشه چون قبلا یه بار درخواست دانلود داده شده بود وارد این قسمت میشه
if (urls.contains(url)) {
return;
}
و کلا میاد بیرون.
خوب پس تکلیف این imgLogo چی میشه ؟ هنوز که کسی بهش نگفته تو که درخواست دانلود دادی، بیا بگیر اینم فایلی که میخواستی، برو از فلان جا بردار.
خوب پس استاد هم اومدن این دو خط کد زیر رو گذاشتن قبل از if (توی addToDownloadList ) تا هر بار که یک item به DownloadManager درخواست دانلود داد توی تابع addToDownloadList به اون item اطلاع داده بشه که عکسی که قراره برات دانلود کنیم یا عکسی که الان داریم برات دانلود میکنیم اسمش مثلا image8 هست، و هر وقت هم که دانلود تموم شد downloadCompleteListener اجرا میشه و اون imgLogo هم به مراد خودش میرسه :).
String filename = HelperString.getFileNameWithExtension(url); AdapterApplication.imageMap.put(imgLogo, filename);
2. در مورد این قسمت هم درست متوجه شدید، اگر از adapter.notifyDataSetChanged استفاده کنیم باعث میشه که list کلا یک بار از اول load بشه و این یکم سرعت رو کاهش میده که خیلی خوشایند نیست.
با سلام خدمت دوستان
با تشکر از دوست گرامی ، CreativeBoy که راهنمایی کردند.
اما یک مشکل :
بار اول که عکس ما برای دانلود فرستاده می شود ، با استفاده از دستور زیر imageView مربوط به آن همراه با نام عکس به هش مپ اضافه می شود :
AdapterApplication.imageMap.put(imgLogo, filename);
و دیگر نیازی نیست که با هر بار scroll و ورود دوباره به متد addToDownloadList ،عناصر ما به هش مپ اضافه شود.
تکلیف imgLogo هم که معلوم است ، بعد از کامل شدن دانلود و پیدا شدن imageView مربوط به ان ، عکس بر روی آن قرار داده می شود.
پس دلیلی برای جابه جایی آن قسمت کد نیست.
عذرخواهی میکنم.اما میخواستم اگه کسی می تونه کمک کنه؟
راستش من حساسیت خاصی روی مطالب دارم برای همین هنوز درگیرم.
با تشکر
خواندن اطلاعات از اینترنت با ویژگی های زیر:
- تغییر پذیر(امکان افزایش یا کاهش یا ویرایش لیست)
- نیاز به دانلود و نمایش عکس یا فیلم
- ...
کاری که من ترجیح می دم انجام بدم اینه:
- ایجاد سرویس برای خواندن اطلاعات از اینترنت(بدون دخالت UI)
- ذخیره ویرایش و حذف اطلاعات در دیتابیس
- نمایش
خب حالغ برای نمایش چکار کنیم؟ می تونیم بگیم :
- هر وقت لیست ویو اسکرول خورد و به آخلرین آیتم یا همون الوار رسید ، ادپتر رو آپدیت کن
- index مربوط به بالاترین آیتم در صفحه نمایش رو به دست بیار و بعد از آپدیت ادپتر اون مکان رو نشون بده
- تصاویر رو هنگام نمایش دانلود کن به این شکل که لینک تصاویر رو از وب سرویس بخون و نام مناسب برای دانلود رو آماده کن و در دیتابیس ذخیره کن ، اگر وجود داشت نشون بده اگر وجود داشت بسم الله دانلود کن
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .