Solved_مشکل استافده از Listener در ListView
سلام دوستان
من توی ListView برای هر Item مقدار Url رو به Listener معرفی میکنم که لیستنر با گرفتن مقدار حجم فایل اون Url مقدار رو در TextView هر Item نشون میده <
مشکلی که هست اینه که Listener با اولید پاسخی که دریافت میکنه (حجم اولین URL گرفته بشه) < دقیقا بعد از گرفتن اولین حجم ، لیستنر اون برای همه ی Item ها صدا زده میشه و برای همه ی Item ها یک مقدار قرار میگیره < و کلا لیستنر چونکه اینترفیس هست به همین صورته و کارش درسته < اما توی ListView کار رو خراب میکنه <
راه هایی که به ذهنم میرسه این هست که برای Listener یک اسم داینامیک استفاده کنیم < که برای تعریف متغیر فکر کنم ممکن نیست !
راه دوم هم اینکه کلا توی لیست ویو حجم رو نشون ندم !
لطفا رهنمایی کنید . ممنون از همه






مشکل دوم هم اینکه وقتی اکتیویتی Resume میشه مقدار دانلود شده فایل رو دیگه نشون نمیده !
جالب اینجاست که Thread در حال اجرا هست و LIstener هم درون ترد هست < ولی Item.setText نمیشه !

این هم سورس مربوطه به لیستنر <
public interface OnProgressDownloadListener {
public void onDateSizeResice(String id, String url, int fileSize);
public void onProgressDownload(int percent, int downloadedSize, int fileSize);
}
این هم نحوه ی ارسال و دریافت اطلاعات در اداپتر
final OnProgressDownloadListener VideoSize = new OnProgressDownloadListener() {
private String ConvertByteToMB(int bytelenght) {
float sizeInKB = (float) bytelenght / 1024;
float sizeInMB = (float) sizeInKB / 1024;
return String.format("%.2f" + "MB", sizeInMB);
}
@Override
public void onDateSizeResice(String id, String url, int fileSize) {
txtDialogTextBody.setText("(" + item.title + ")" + " با حجم " + ConvertByteToMB(fileSize) + " آماده دانلود ");
}
@Override
public void onProgressDownload(int percent, int downloadedSize, int fileSize) {}
};
FileDownloader.getFileSize(item.id, item.url, VideoSize);
متد مربوط به getFileSize
private static int finalFileSize;
public static void getFileSize(final String id, final String downpath, final OnProgressDownloadListener listener) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connetction2 = null;
try {
URL url = new URL(downpath);
connetction2 = (HttpURLConnection) url.openConnection();
connetction2.getInputStream();
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
finalFileSize = connetction2.getContentLength();
G.HANDLER.post(new Runnable() {
@Override
public void run() {
listener.onDateSizeResice(id, downpath, finalFileSize);
}
});
}
});
thread.start();
}

لیستنر بعد از Resume شدن همچنان در حال انجام هست < توی لاگ بخوبی نشون داده میشه <
اما چرا txtDownListViewTitle بعد از Resume شدن اکتیوتی دیگه چیزی بخوبی نشون نمیده < !
@Override
public void onProgressDownload(int percent, int downloadedSize, int fileSize) {
//این خط نشون میده دانلود بعد از ریزوم شدن در حال انجام هست
Log.i("LOG", " % : " + percent);
// این خط بعد از ریزوم دیگه کاری که انجام میده روی لیست ویو دیده نمیشه
txtDownListViewTitle.setText("Download : " + "%" + percent + " (" + ConvertByteToMB(downloadedSize) + " / " + ConvertByteToMB(fileSize) + ")");
}

توی Adapter امکان قرار دادن هندلر نیست ! Ctrl+Space میزنم نمیشناسه <
G.HANDLER.post(new Runnable() {
@Override
public void run() {
}
});
بصورت دستی کپی پیست کردم تا هندلر رو شناخت ! > ولی باز هم بعد از resume شدن بدرستی ست نمیشه !
@Override
public void onProgressDownload(final int percent, final int downloadedSize, final int fileSize) {
Log.i("LOG", " % : " + percent);
G.HANDLER.post(new Runnable() {
@Override
public void run() {
txtDownListViewTitle.setText("Download : " + "%" + percent + " (" + ConvertByteToMB(downloadedSize) + " / " + ConvertByteToMB(fileSize) + ")");
}
});
//txtDownListViewTitle.invalidate();
//adapter.notifyDataSetInvalidated();
}

این ListView < آیتم هارو از Preferences میگیره و توی خودش ست میکنه <
برای همین هربار که اکتیویتی resume میشه < من adapter رو پاک میکنم و از اول میسازم که اگر Preferences مقدار جدیدی گرفته باشه به خودش اضاف کنیم <
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .