我使用universal image loader
库将大约50张图片从网址加载到listview
。
这是binderdata。
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
。
如何解决这个问题?
更新
这是来自Picasso
图书馆的Binderdata。
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;
}
}
这样可以加载图像,但是当向上或向下滚动时,图像会重新加载。
答案 0 :(得分:2)
好的,这是我使用picasso实现的代码,并且它可以顺利地为我工作
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;
}
}
答案 1 :(得分:1)
尝试使用Aquery Image加载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
答案 2 :(得分:0)
发现这是一个非常简单易用的解决方案,为什么建议你。 在适配器中,您可以使用此代码下载图像并在视图中显示。
Picasso.with(mContext).load(url).into(mImageView);
下次滚动时,图像将从缓存中加载,并且不会花费太多时间再次加载。
在您的应用级别build.gradle
中compile 'com.squareup.picasso:picasso:2.5.2'
如果您想为每个视图添加进度条,则可以使用:
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) {
}
};