来自url的android加载图像使用通用图像加载器

时间:2016-03-09 09:47:08

标签: android universal-image-loader

我使用通用图像加载程序从网址加载大约50张图像 具有一些图像的列表图像具有960px×1378px的尺寸,并且一些图像具有1920px×1378px的尺寸 这是我的活页夹数据

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();
    imageLoader.getInstance().displayImage(uri, holder.iv_img);
    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);

所有图像都已加载,但向上或向下滚动时,图像向上或向下重新加载
和另一个问题 当屏幕垂直时,屏幕宽度使用图像尺寸960x1378
所有图像填充屏幕
但是当屏幕旋转到水平时,屏幕宽度使用图像1960x1378的尺寸和图像960x1378会变小 为什么 ?以及如何解决它 抱歉我的英语不好 谢谢你的阅读

2 个答案:

答案 0 :(得分:0)

ListView中每一行的视图都是可重用的,因此当您滚动填充行的正确数据时,适配器中的getView()方法需要多次调用。这是ListView适配器的正常行为。您的getView()电话会重新加载您的图片。

要理解为什么getView()需要打电话,我建议你   - 您可以创建一个int []数组来保存图像已加载的位置   - 然后在getView()检查图像是否已加载
  - 如果已加载,则不加载

我希望结果是在滚动ListView之后,ListView的所有项目都是相同的

希望这个帮助

答案 1 :(得分:-1)

您每次都在 getView()中创建新实例

您的更新代码:

public class BinderDataImg extends BaseAdapter {
static final String KEY_IMG = "img";
LayoutInflater inflater;
List<HashMap<String,String>> imgHashmap;
ViewHolder holder;
ImageLoader imageLoader = ImageLoader.getInstance();

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.displayImage(uri, holder.iv_img);
    return vi;
}
static class ViewHolder{
    ImageView iv_img;
}

}

希望这会对你有所帮助。