通用图像加载器 - 在多个视图中使用相同的图像

3
我正在使用Universal Image Loader从后端加载图片以在列表中显示用户图像;然而,如果图标多次出现,则Universal Image Loader不会填充所有视图。
  • [用户图像1] - 没有图像
  • [用户图像1] - 没有图像
  • [用户图像2] - 正常
  • [用户图像2] - 没有图像
  • [用户图像3] - 正常
  • [用户图像1] - 正常
然后在另一个屏幕上:
  • [用户图像1] - 正常
  • [用户图像1] - 没有图像
我正在使用cacheInMemory和cacheOnDisk,这似乎改善了它。之前它只在一个视图中显示,而不是大多数,但我需要所有的视图都能正常工作。
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheInMemory( true )
            .cacheOnDisk( true )
            .build();

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( this )
            .threadPoolSize( 3 )
            .defaultDisplayImageOptions( defaultOptions )
            .build();

ImageLoader.getInstance().init( config );

我不是使用ListView来完成这个任务,我使用ScrollView并用自定义布局进行填充。
private View createSmallActivity( LayoutInflater inflater, final Event activity ) {

    final View view;
    view = inflater.inflate( R.layout.activity_posted_small, null );
    ...
    // The owner's image.
    if( activity.ownerImageUrl != null ) {
        Loader.loadImage( getActivity(),
               activity.ownerImageUrl,
               R.drawable.postedactivitysmall_imageprofileempty,
               ( ImageView ) view.findViewById( R.id.profileImage ) );
    }
    return view;
}



// Loader.loadImage
// Setting the targetSize, and masking the image with a resource.
public static void loadImage( Context context, String url, int resource, ImageView view ) {
    Drawable d = context.getResources().getDrawable( resource );
    int h = d.getIntrinsicHeight();
    int w = d.getIntrinsicWidth();

    ImageSize targetSize = new ImageSize( w, h );
    ImageLoader.getInstance().loadImage( url, targetSize, new MaskImageLoader( context, view, resource ) );
}

有什么想法可以改进通用图像加载器,以确保所有视图都被正确填充吗?
谢谢你的帮助!

你能否发布 Adapter 类中 getView 函数的代码,其中加载了图片? - Abhishek V
我没有使用适配器,而是使用了ScrollView并填充了一个布局。我在问题中添加了更多关于如何加载它的细节。同样的问题也发生在另一个屏幕上,我必须显示相同的图像两次,也不能将其放入ScrollView中。 - advice
你能发一下你的MaskImageLoader代码吗? - Médéric
2个回答

2
这是因为Universal Image Loader会取消先前具有相同url的请求(用作ID)。为了防止这种行为,请替换原代码。
ImageLoader.getInstance().loadImage( url, targetSize, new MaskImageLoader( context, view, resource ) );

by

ImageLoader.getInstance().displayImage(url, 
    new NonViewAware(new ImageSize(w, h), ViewScaleType.CROP),
    new MaskImageLoader(context, view, resource));

0

我建议您使用ListView。也许您应该全局声明ImageLoader,然后使用它。

ImageLoader imageLoader = ImageLoader.getInstance();
...
imageLoader.displayImage(imageUri, imageView);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接