آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

Solved_مشکل استافده از Listener در ListView

Criss  9 سال پیش  9 سال پیش
+1 0

سلام دوستان

من توی ListView برای هر  Item مقدار Url رو به Listener معرفی میکنم که لیستنر با گرفتن مقدار حجم فایل اون Url مقدار رو در TextView هر Item نشون میده <

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

راه هایی که به ذهنم میرسه این هست که برای Listener یک اسم داینامیک استفاده کنیم < که برای تعریف متغیر فکر کنم ممکن نیست !

راه دوم هم اینکه کلا توی لیست ویو حجم رو نشون ندم !

لطفا رهنمایی کنید . ممنون از همه

+1 0
شما باید لیسنر رو برای هر آیتم جدا تعریف کنی ، یعنی کدی که مربوطه به لیسنر هست باید برای هر آیتم نوشته بشه که اینکار رو با نوشتن دستور مربوطه به دانلودر در متد Fill میتونید انجام بدید . (9 سال پیش)
0 0
من برای هر بار گرفتن اطلاعات یک New Listener تعریف میکنم که توی Item.SetOnClick هست < فکر کنم این لیستنر رو باید تفکیک کنه ، برای محکم کاری Item.id رو هم فرستادم و بدون هیچ تغیری روی Item.id اون رو دریافت کردم و توی دستور قرار دادم و با Item.id مقایسه کردم اما باز هم با اینکه مقایسه Item.id ها کار فیلتر کردن لیستنر هارو انجام میده < اما مقادیری که به دست میرسه تکراری هست (9 سال پیش)
+1 0
یه چیزی رو فراموش کردم از اونجایی که توی ادپتری باید مثلا url رو به عنوان یک مشخصه نگه داری و زمانی که قرار شد لیسنر رو صدا کنه چک کنه آیا url موجود در لیسنر با url ارسال برابر هست یا نه اینطوری مشکل تکراری شدن و بهم ریختگی در لیستت حل میشه . (9 سال پیش)
0 0
دقیقا من هم همین کار رو کردن هم Item.id و هم Item.url رو تست کردم < توی لیستنر 4 تا url ارسال میشه و 4 تا url هم دقیقا دریافت میشه < اما مقدار هایی که همراه هر Url بر میگرده توی لاگ تکراری هست ! < با اینکه Url ها تکراری نیستند ! مقدار جلوی url ها تکراری دریافت میشه ! (9 سال پیش)
0 0
بخشی از کد مربوطه رو قرار بدید تا بررسی بشه کرد . (9 سال پیش)
 برای این سوال 5 پاسخ وجود دارد.
پاسخ به سوال 
Criss  9 سال پیش
+1 0

مشکل دوم هم اینکه وقتی اکتیویتی Resume میشه مقدار دانلود شده فایل رو دیگه نشون نمیده !

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

0 0
دوستان وقتی اکتیویتی onResume میشه چه اتفاقی برای LIstVIew میوفته ؟ کدوم متد در ListView اول اجرا میشه ؟ (9 سال پیش)
پاسخ به سوال 
Criss  9 سال پیش
0 0

این هم سورس مربوطه به لیستنر <

 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();
}

 

 

0 0
این کد رو کجا دارین مینویسین؟ داخل fill آداپتر؟ (9 سال پیش)
0 0
این کد رو کجا دارین مینویسین؟ داخل fill آداپتر؟ کلاس آداپترتو بزار به نگاه کنیم (9 سال پیش)
0 0
البته اگر اکتیویتی Resume بشه گاهی این مقادیر درست نشون داده میشه . این مشکل موقتا حل شد < بجای اینکه توی خود Item ها حجم نمایش داده بشه < توی یک Dialog بعد از کلیک شدن روی Item نمایش داده میشه ! < الان مشکل بزرگتر این هست که مقدار دانلود شده ی فایل رو روی Item نشون میدم و به درستی برای همه ی Item ها کار میکنه و مشکل تکراری شدن وجود نداره ! اما بعد از resume شدن اکتیوتی با اینکه فایل همچنان در حال دانلود هست < مقدار دانلود شدن رو نشون نمیده ! (9 سال پیش)
0 0
دقیقا داخل fill قرار داره ! دوستان این مشکل رو فعلا ول کنید < فعلا بصورت موقتی حل شد ! مهم این قسمت دوم هست که بعد از resume شدن اکتیویتی مقدار Download شده دیگه نشون داده نمیشه ! (9 سال پیش)
پاسخ به سوال 
Criss  9 سال پیش
0 0

لیستنر بعد از 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) + ")");
}

 

 

+1 0
برای تغییر دادن در UI نیاز هست حتما در ترد مین این کار انجام بشه هنلدر رو بهش ست کردید ؟ (9 سال پیش)
پاسخ به سوال 
Criss  9 سال پیش
0 0

توی 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();
}

 

+2 0
من فکر میکنم شما پروژه رو بد پیاده کردید و کد هاتون خیلی باگ داره ، به نظر من یکبار از اول با تمرکز و دقت بیشتر از شروع کنید و پروژه رو از صفر بنویسید ، البته قسمت های باگ دار رو منظورم هست . (9 سال پیش)
0 0
البته این رو بگم < موقع resume شدن اکتیویتی یکبار از اول adapter.clear میشه و از اول ساخته میشه و ست میشه < (9 سال پیش)
پاسخ به سوال 
Criss  9 سال پیش
0 0

این ListView < آیتم هارو از Preferences میگیره و توی خودش ست میکنه <

برای همین هربار که اکتیویتی resume میشه < من adapter رو پاک میکنم و از اول میسازم که اگر Preferences مقدار جدیدی گرفته باشه به خودش اضاف کنیم <

 

 

 

0 0
مشکل در روش برنامه نویسی بود < آموزش استاد رو یکبار نگاه کردم < روش اصولی رعایت کردم < مشکل حل شد (9 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .