بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

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

مدیریت گفتگو
Criss 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام دوستان

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

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

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

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

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

نظرات

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

پاسخ‌ها 5

Criss 11 سال پیش

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

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

نظرات

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

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

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

 

 

نظرات

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

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

 

 

نظرات

کاشی زاده 11 سال پیش
برای تغییر دادن در UI نیاز هست حتما در ترد مین این کار انجام بشه هنلدر رو بهش ست کردید ؟
Criss 11 سال پیش

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

 

نظرات

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

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

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

 

 

 

نظرات

Criss 11 سال پیش
مشکل در روش برنامه نویسی بود < آموزش استاد رو یکبار نگاه کردم < روش اصولی رعایت کردم < مشکل حل شد

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