Android从URL加载图像
问题描述:
我使用universal image loader
库从URL加载约50图像到listview
。 这是binder数据。Android从URL加载图像
public class BinderDataImg extends BaseAdapter {
static final String KEY_IMG = "img";
LayoutInflater inflater;
List<HashMap<String,String>> imgHashmap;
ViewHolder holder;
public BinderDataImg() {
// TODO Auto-generated constructor stub
}
public BinderDataImg(Activity act, List<HashMap<String,String>> map) {
this.imgHashmap = map;
inflater = (LayoutInflater) act
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
// TODO Auto-generated method stub
return imgHashmap.size();
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null){
vi = inflater.inflate(R.layout.list_img, null);
holder = new ViewHolder();
holder.iv_img =(ImageView)vi.findViewById(R.id.imageViewImg);
vi.setTag(holder);
}
else{
holder = (ViewHolder)vi.getTag();
}
String uri = imgHashmap .get(position).get(KEY_IMG);
ImageLoader imageLoader = ImageLoader.getInstance();
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
.cacheOnDisc(true).resetViewBeforeLoading(true).build();
imageLoader.displayImage(uri, holder.iv_img, options);
return vi;
}
static class ViewHolder{
ImageView iv_img;
}
}
活动。
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheOnDisc(true).cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
.displayer(new FadeInBitmapDisplayer(300)).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
getApplicationContext())
.defaultDisplayImageOptions(defaultOptions)
.memoryCache(new WeakMemoryCache())
.discCacheSize(100 * 1024 * 1024).build();
ImageLoader.getInstance().init(config);
差不多,但并不是所有的图像加载和logcat中有一个OutOfMemoryError
。 这怎么解决?
更新:
这是Binderdata从Picasso
库。
public class BinderDataImg extends BaseAdapter {
static final String KEY_IMG = "img";
LayoutInflater inflater;
List<HashMap<String,String>> imgHashmap;
ViewHolder holder;
public BinderDataImg() {
// TODO Auto-generated constructor stub
}
Activity act;
public BinderDataImg(Activity act, List<HashMap<String,String>> map) {
this.imgHashmap = map;
inflater = (LayoutInflater) act
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.act = act;
}
public int getCount() {
// TODO Auto-generated method stub
return imgHashmap.size();
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null){
vi = inflater.inflate(R.layout.list_img, null);
holder = new ViewHolder();
holder.iv_img =(ImageView)vi.findViewById(R.id.imageViewImg);
vi.setTag(holder);
}
else{
holder = (ViewHolder)vi.getTag();
}
String uri = imgHashmap .get(position).get(KEY_IMG);
Picasso.with(act).load(uri).into(holder.iv_img);
return vi;
}
static class ViewHolder{
ImageView iv_img;
}
}
这会加载图像确定,但向上或向下滚动图像时会再次加载。
答
确定这里是用毕加索和我实现的代码为我工作顺利
public class MyFragmentAdapter extends ArrayAdapter<Video> {
private Context mContext;
private LayoutInflater mInflater;
private Bitmap mBitmap;
public MyFragmentAdapter(Context context, int resource, List<Video> objects) {
super(context, resource, objects);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.mContext = context;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(
R.layout.item_gallery, null);
holder.imageview = (ImageView) convertView.findViewById(R.id.iv_thumbImage);
holder.pb = (ProgressBar) convertView.findViewById(R.id.iv_progressbar);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.pb.setVisibility(View.VISIBLE);
String url="Url here";
Picasso.with(mContext).load(thumbnail_path).placeholder(R.drawable.icon_video).into(holder.imageview, new Callback() {
@Override
public void onSuccess() {
holder.pb.setVisibility(View.INVISIBLE);
}
@Override
public void onError() {
holder.pb.setVisibility(View.INVISIBLE);
}
});
}
return convertView;
}
public static class ViewHolder {
ImageView imageview;
ProgressBar pb;
}
}
答
在找到这个非常简单和容易的解决方案,这就是为什么建议你。 在您的适配器中,您可以使用此代码下载图像并在视图中显示。
Picasso.with(mContext).load(url).into(mImageView);
下一次当您滚动时,图像将从缓存加载,并且不会花费太多时间再次加载。
在你的应用程序级的build.gradle
compile 'com.squareup.picasso:picasso:2.5.2'
如果要附加进度条,每个viewholder那么你可以使用:
Picasso.with(mContext).load(url).into(target);
Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
holder.mImageView.setImageBitmap(bitmap);
holder.mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
答
尝试用Aquery图像加载lib,这对我工作
public class CustomAdapterAccept extends BaseAdapter {
private Context context;
private ArrayList<HashMap<String,String>> listData;
private static final String TAG_NAME="brandname";
private static final String TAG_IMAGE="brandimg";
public CustomAdapterAccept(Context context,ArrayList<HashMap<String,String>> listData) {
this.context = context;
this.listData=listData;
aQuery = new AQuery(this.context);
}
@Override
public int getCount() {
return listData.size();
}
@Override
public Object getItem(int position) {
return listData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.list_item_cat, null);
holder.propic = (ImageView) convertView.findViewById(R.id.brndimage);
holder.txtproname = (TextView) convertView.findViewById(R.id.txtcatname);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.txtproname.setText(listData.get(position).get(TAG_NAME));
aQuery.id(holder.propic).image(listData.get(position).get(TAG_IMAGE), true, true, 0, R.drawable.ic_launcher);
aQuery.id(holder.propic).image(listData.get(position).get(TAG_IMAGE),true,true,0,R.drawable.ic_launcher);
// image parameter : 1 : memory cache,2:file cache,3:target width,4:fallback image
return convertView;
}
class ViewHolder{
ImageView propic;
TextView txtproname;
TextView txtproid;
TextView txtprofilecast;
TextView txtprofileage;
TextView txtprofileplace;
}
}
更多看到this
可以使用毕加索库this.Its更容易使用和优化,以及,这需要缓存和内存的护理 –
当我用毕加索库,图像重载滚动时上或下 。所以我尝试通用图像加载器库,我没有与毕加索图书馆相同的问题,但我得到这个问题 – abcd1234
毕加索缓存图像,所以他们不应该重新下载。如果他们然后是有代码逻辑 –