View Full Version : جا به جا شدن عکس ها بعد از لود شدن از اینترنت در listview
saeedhushmand
پنج شنبه 11 دی 1393, 22:28 عصر
با عرض سلام خدمت دوستان ، بنده از لینک های اینترنت دارم عکس هایی رو لیست ویو در imageview لود میکنم و مشکلیم نیست مشکل من اینکه وقتی اسکرول رو در لیست ویو بالا و پایین میکنم عکس ها مدام تغییر میکنند و پس از یه مدت دوباره عکس های صحیح می یان
چیکار باید بکنم که عکس ها پس از لود دوباره تغییر نکنند
باتشکر
storm_saeed
پنج شنبه 11 دی 1393, 22:48 عصر
مشکل اینه که عکس ها به درستی کش نشدند از imageLoader ای چیزی استفاده میکنید ؟
saeedhushmand
پنج شنبه 11 دی 1393, 23:01 عصر
اینه کدش
package com.pcfars.martyr;
import java.io.File;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Hashtable;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MartyrListViewAdapter extends ArrayAdapter<Rowitem>{
Context context;
public MartyrListViewAdapter(Context context, int resourceId,
List<Rowitem> items) {
super(context, resourceId, items);
this.context = context;
}
private class ViewHolder {
TextView txtID;
TextView txtBriefDescription;
ImageView imgMartyr;
}
int i = 0;
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
Rowitem rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE );
if (convertView == null) {
convertView = mInflater.inflate(R.layout.listitem, null);
holder = new ViewHolder();
holder.txtID = (TextView) convertView.findViewById(R.string.txtID);
holder.txtBriefDescription = (TextView) convertView.findViewById(R.string.txtBriefDescript ion);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.txtID.setText(rowItem.getID());
Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
"BNaznnBd.ttf");
holder.txtBriefDescription.setTypeface(tf);
holder.imgMartyr = (ImageView) convertView.findViewById(R.string.imgMartyr);
new ImageLoadTask(rowItem.getimageId(),holder.imgMarty r).execute();
if (position % 2 == 1) {
convertView.setBackgroundColor(Color.parseColor("#f6f6f4"));
} else {
convertView.setBackgroundColor(Color.WHITE);
}
holder.txtBriefDescription.setText(Html.fromHtml(r owItem.getBriefDescription()), TextView.BufferType.SPANNABLE);
Animation animation = AnimationUtils.loadAnimation(convertView.getContex t(), R.anim.slide_right_in);
convertView.startAnimation(animation);
return convertView;
}
public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> {
private String url;
private ImageView imageView;
public ImageLoadTask(String url, ImageView imageView) {
this.url = url;
this.imageView = imageView;
}
@Override
protected Bitmap doInBackground(Void... params) {
try {
URL urlConnection = new URL(url);
HttpURLConnection connection = (HttpURLConnection) urlConnection
.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
imageView.setImageBitmap(result);
}
}
}
storm_saeed
پنج شنبه 11 دی 1393, 23:16 عصر
خب اول مشکل کدت
اینکه عکس ها کش نمیشن هر دفعه داری میگیریش و وقتی داری اسنکرون عکس هارو از اینترنت میگیری و وقتی که اسکرول میکنی مشکلی که پیش میاد اینه که مثلا در سطر ۲۰ ام هستی ولی داره عکس اول لود میشه و تا بیاد برسه به ردیف ۲۰ ام چند ثانیه زمان میبره
راه حلش اینه که عکس ها رو دفعه اول که از اینترنت میگیری بیت مپ هارو کش کنی ( در LruCache مثل یه سری key , value که key = اسم دلخواه value = bitmap) و از دفعات بعد بیای ببینی اگه تو کش ات بیت مپ مربوطه هست از اونجا عکس رو بفرستی به imageView ات وگرنه که باید بری از اینترنت بگیری
برای راحتی کار از یه سری لایبرری های اماده مثل پیکاسو و Universal Image Loader استفاده میکنن که فقط بهش url و imageView میدی و خودش میره برات اینکارارو میکنه
hamedg1366
جمعه 12 دی 1393, 09:16 صبح
خب اول مشکل کدت
اینکه عکس ها کش نمیشن هر دفعه داری میگیریش و وقتی داری اسنکرون عکس هارو از اینترنت میگیری و وقتی که اسکرول میکنی مشکلی که پیش میاد اینه که مثلا در سطر ۲۰ ام هستی ولی داره عکس اول لود میشه و تا بیاد برسه به ردیف ۲۰ ام چند ثانیه زمان میبره
راه حلش اینه که عکس ها رو دفعه اول که از اینترنت میگیری بیت مپ هارو کش کنی ( در LruCache مثل یه سری key , value که key = اسم دلخواه value = bitmap) و از دفعات بعد بیای ببینی اگه تو کش ات بیت مپ مربوطه هست از اونجا عکس رو بفرستی به imageView ات وگرنه که باید بری از اینترنت بگیری
برای راحتی کار از یه سری لایبرری های اماده مثل پیکاسو و Universal Image Loader استفاده میکنن که فقط بهش url و imageView میدی و خودش میره برات اینکارارو میکنه
میشه یه نمونه استفاده از Universal Image Loader رو کد بزارین !
نحوه استفاده از کتابخونش رو بلد نیستم.
با تشکر
storm_saeed
جمعه 12 دی 1393, 11:57 صبح
تو خود گیت هابش نوشته
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationCon text())
.defaultDisplayImageOptions(defaultOptions)
.diskCache(new UnlimitedDiscCache(cacheDir))
.build();
ImageLoader.getInstance().init(config);
اینطوری کانفیگ میشه(یه بار تو کل برنامه یعنی تو همون اکتیویتی اولتون) از اسمشم معلومه کانفیگش چیه
وحالا تو کدتون میتونید این تیکه رو بنویسید مثلا تو متود getView در listview
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnFail(R.drawable.error)
.showImageOnLoading(R.drawable.loading)
.cacheOnDisk(true)
.build();
ImageLoader.getInstance().displayImage(url, imageView, options);
قابلیت خوبش اینه که تو هنگام لود r.drawable.loading رو نشون میده اگه به مشکل خورد r.drawable.error رونشون میده وگرنه عکس رو نشون میده
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.