View Full Version : دریافت عکس از اینترنت و نمایش در listview
majidariamanesh
شنبه 02 خرداد 1394, 19:07 عصر
من یه سری اطلاعات رو از json میگیرم
و تو simplelistadapter نمایش میدم
حالا یکی از این اطلاعات آدرس یک عکسه
میخوام این عکس توی imageview که تعریف کردم تو list نمایش داده بشه
اما هر کاری میکنم فقط رشته میتونم بفرستم به list
ListAdapter adapter = new SimpleAdapter(
adslist.this, contactList,
R.layout.list_items, new String[] { TAG_NAME
}, new int[] { R.id.title });
setListAdapter(adapter);
میخام به این عکس نسبت بدم
parniaznet
شنبه 02 خرداد 1394, 22:06 عصر
خب می خوای عکس نمایش داده بشه فقط یا اینکه هم تو گوشی کاربر ذخیره و کش شه و هم نمایش داده بشه؟
majidariamanesh
شنبه 02 خرداد 1394, 22:24 عصر
نه فقط میخام نمایش داده بشه چیزی ذخیره نشه
parniaznet
یک شنبه 03 خرداد 1394, 00:05 صبح
اول یه کلاس با اسم DrawableManager بساز و کد های زیر رو داخلش کپی کن :
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;
public class DrawableManager {
private final Map<String, Drawable> drawableMap;
public DrawableManager() {
drawableMap = new HashMap<String, Drawable>();
}
public Drawable fetchDrawable(String urlString) {
if (drawableMap.containsKey(urlString)) {
return drawableMap.get(urlString);
}
Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
if (drawable != null) {
drawableMap.put(urlString, drawable);
Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
+ drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
+ drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
} else {
Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
}
return drawable;
} catch (MalformedURLException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
} catch (IOException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
}
}
public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
if (drawableMap.containsKey(urlString)) {
imageView.setImageDrawable(drawableMap.get(urlStri ng));
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
// imageView.setImageDrawable((Drawable) message.obj);
imageView.setBackgroundDrawable((Drawable) message.obj);
}
};
Thread thread = new Thread() {
@Override
public void run() {
//TODO : set imageView to a "pending" image
Drawable drawable = fetchDrawable(urlString);
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
};
thread.start();
}
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
}
بعد در جایی که می خوای عکس و نمایش بدی این کد ها رو فراخونی کن و به جای لینک استرینگی که درست کردی رو بزار :
ImageView iv = (ImageView) result.findViewById(R.id.imageView1);
DrawableManager dm = new DrawableManager();
dm.fetchDrawableOnThread("http://www.yoursite.com/images/image.png",iv);
majidariamanesh
یک شنبه 03 خرداد 1394, 08:39 صبح
تشکر الان امتحان میکنم
فقط کاش یجوری این کلاس و میذاشتید
که نخام HTML هار دورشو پاک کنم یکی یکی
majidariamanesh
یک شنبه 03 خرداد 1394, 10:32 صبح
ir.npvasta.project.yotab.DrawableManager$1.handleM essage(DrawableManager.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99 )
کد شما این خطا رو داد
parniaznet
یک شنبه 03 خرداد 1394, 11:23 صبح
نمیدونم چرا اون شکلی شده کد ها
این کدهای سالم رو تست کنید :
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;
public class DrawableManager {
private final Map<String, Drawable> drawableMap;
public DrawableManager() {
drawableMap = new HashMap<String, Drawable>();
}
public Drawable fetchDrawable(String urlString) {
if (drawableMap.containsKey(urlString)) {
return drawableMap.get(urlString);
}
Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
if (drawable != null) {
drawableMap.put(urlString, drawable);
Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
+ drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
+ drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
} else {
Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
}
return drawable;
} catch (MalformedURLException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
} catch (IOException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
}
}
public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
if (drawableMap.containsKey(urlString)) {
imageView.setImageDrawable(drawableMap.get(urlStri ng));
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
// imageView.setImageDrawable((Drawable) message.obj);
imageView.setBackgroundDrawable((Drawable) message.obj);
}
};
Thread thread = new Thread() {
@Override
public void run() {
//TODO : set imageView to a "pending" image
Drawable drawable = fetchDrawable(urlString);
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
};
thread.start();
}
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
}
majidariamanesh
یک شنبه 03 خرداد 1394, 12:21 عصر
مشکل کماکان پابرجاست
dalmif
یک شنبه 03 خرداد 1394, 15:53 عصر
سلام دوست عزیز.
کار ساده ای هست.
آدرس رو بگیرید و به متد زیر بدید تا بهتون bitmap تحویل بده و بعد شما می توانید setimageBitmap کنید تا عکستون مستقیم نشون بده توی ایمیج ویو.
ImageView img = (ImageView) findViewById(R.id.imageView1);
try {
URL url = new URL("Your URL");
//try this url = "http://0.tqn.com/d/webclipart/1/0/5/l/4/floral-icon-5.jpg"
HttpGet httpRequest = null;
httpRequest = new HttpGet(url.toURI());
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient
.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity b_entity = new BufferedHttpEntity(entity);
InputStream input = b_entity.getContent();
Bitmap bitmap = BitmapFactory.decodeStream(input);
img.setImageBitmap(bitmap);
} catch (Exception ex) {
}
اگه خطا داد این کد رو در ترد بزارید مشکلتون حل میشه:لبخندساده:
majid_7
چهارشنبه 06 خرداد 1394, 08:15 صبح
سلام
بهترین روش به نظر من همینه که دوستمون جناب dalmif گفتند استفاده از کلاس bitmap و کلاس AsyncTask برای دریافت تصاویر .
البته یه ایراد کوچک داره این روش اونم استفاده زیاد از حافظه هست که اگه تعداد عکسهاتون زیاده بهتره از روش Lazyload استفاده بشه و از اون بهتر cache کردن عکسها با استفاده از LruCache هست.
امیدوارم مفید بوده باشه
موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.