【发布时间】:2015-03-21 01:34:32
【问题描述】:
在我的 Android 项目中,我显示了从 web service(Url) 到 ListView 的所有图像,为此我使用了 Universal image loader。在列表中加载一些图像后,如果我向下滚动然后向上滚动,已经加载的图像正在重新加载。
DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions
.Builder().cacheOnDisk(true).cacheInMemory(true).considerExifParams(true);
ImageLoader.getInstance().displayImage(imageUri, imageView,
displayImageOptionsBuilder.build());
我尝试了什么
ImageAware imageAware = new ImageViewAware(imageView, false);
ImageLoader.getInstance().displayImage(imageUri, imageAware,displayImageOptionsBuilder.build());
即使使用此代码,它也不会在 ListView reloading 中进行任何更改
已编辑
适配器类
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final String name = getItem(position);
View view = convertView;
if (view == null) {
view = createView();
ViewHolder viewHolder = new ViewHolder();
viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1);
view.setTag(viewHolder);
}
ImageHelper.initImage(viewHolder.image,
imageUrl,
R.drawable.vx_loading, loadingImageResource,displayOptionsCustomizer);
return view;
}
private final DisplayOptionsCustomizer displayOptionsCustomizer = new DisplayOptionsCustomizer() {
@Override
public void customizeImageOptions(DisplayImageOptions.Builder displayImageOptionsBuilder) {
displayImageOptionsBuilder.displayer(new RoundedBitmapDisplayer(ApplicationUtils
.dipToPixelsRounded(6, getContext()), 0));
}
};
static class ViewHolder {
public ImageView image;
}
ImageHelper.java
public static void initImage(final ImageView imageView, final String imageUri,
final int noImageResource, final int loadingImageResource,
final DisplayOptionsCustomizer displayOptionsCustomizer) {
if (StringUtils.isNotBlank(imageUri)) {
DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions
.Builder().cacheOnDisk(true).cacheInMemory(true).considerExifParams(true);
displayImageOptionsBuilder.showImageOnLoading(loadingImageResource)
.showImageOnFail(noImageResource);
if (displayOptionsCustomizer != null) {
displayOptionsCustomizer.customizeImageOptions(displayImageOptionsBuilder);
}
ImageLoader.getInstance().displayImage(imageUri, imageView,
displayImageOptionsBuilder.build());
} else {
if (noImageResource != 0) {
imageView.setImageResource(noImageResource);
} else {
imageView.setVisibility(View.GONE);
}
}
}
根据编辑了适配器类
Dhir Pratap回答
public class ImagesListAdapter extends ArrayAdapter<String> {
private List imagesList = new ArrayList<String>();
private Context context;
ImageLoader imageLoader;
DisplayImageOptions options;
public ImagesListAdapter(Context context, List<String> imagesList) {
super(context, -1,imagesList);
this.imagesList = imagesList;
this.context = context;
imageLoader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder().cacheInMemory(true)
.cacheOnDisk(true).resetViewBeforeLoading(true)
.showImageForEmptyUri(fallbackImage)
.showImageOnFail(fallbackImage)
.showImageOnLoading(fallbackImage).build();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final String name = getItem(position);
View view = convertView;
ViewHolder viewHolder;
if (view == null) {
view = createView();
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1);
view.setTag(viewHolder);
}
else{
viewHolder = (ViewHolder) view.getTag(viewHolder);
}
/*ImageHelper.initImage(viewHolder.image,
imageUrl,
R.drawable.vx_loading, loadingImageResource,displayOptionsCustomizer);*/
imageLoader.displayImage(imageUrl,viewHolder.image,
options);
return view;
}
/* private final DisplayOptionsCustomizer displayOptionsCustomizer = new DisplayOptionsCustomizer() {
@Override
public void customizeImageOptions(DisplayImageOptions.Builder displayImageOptionsBuilder) {
displayImageOptionsBuilder.displayer(new RoundedBitmapDisplayer(ApplicationUtils
.dipToPixelsRounded(6, getContext()), 0));
}
}; */
static class ViewHolder {
public ImageView image;
}
}
【问题讨论】:
-
您的问题不清楚...您是如何在Adapter的getView中使用ImageLoader的?图像有多大(重要的是图像加载器可以在内存不足时释放缓存的位图 - 所以它必须从磁盘缓存甚至互联网重新加载它(见下一个问题))?服务器是否还使用电子标签(或其他缓存标头)?
-
@Selvin 我也用 Adapter 类的 getView() 方法编辑了我的问题。
-
图像大小不同,每张图像都有自己的大小。它们可能是 14.1 kb、13.2 kb、27 kb、23.4 kb、11 kb 等。
-
我的意思是宽度和高度,如果你把 Bitmap 类考虑在内,那么磁盘大小没有任何意义......仍然,最重要的是如果在服务器上启用了缓存
标签: android listview android-listview universal-image-loader