在我的Android项目中,我显示了web service(Url)
到ListView
的所有图片,为此我使用了Universal image loader
。如果我向下滚动然后向上滚动,则在List中加载一些图像后,已经加载的图像再次重新加载。
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;
}
}
答案 0 :(得分:12)
您可以执行的修补程序很少
您的观看者几乎没用。您必须按照以下方式使用它
ViewHolder viewHolder;
if (view == null) {
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1);
view.setTag(viewHolder);
}else{
viewHolder = view.getTag(viewHolder);
}
您应该只声明一次ImageLoader和DisplayImageOptions实例。可能在构造函数中。
ImageLoader imageLoader = ImageLoader.getInstance();
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
.cacheOnDisc(true).resetViewBeforeLoading(true)
.showImageForEmptyUri(fallbackImage)
.showImageOnFail(fallbackImage)
.showImageOnLoading(fallbackImage).build();
在获取视图中,您只需按以下方式加载图片
修改强> 我没有使用过ImageAware。你必须这样使用。
ImageAware imageAware = new ImageViewAware(viewHolder.image, false);
imageLoader.displayImage(imageUri, imageAware,options);
The answer这里说这确实是UIL的一个问题,在版本1.9中修复了。
编辑2: 我在Github上跟踪了关于这个问题的讨论,发现this answer对图片网址进行了手动检查。它建议做以下
//lets prevent "blinking" by "saving URL tag" hack
if (viewHolder.image.getTag() == null ||
!viewHolder.image.getTag().equals(imageUri)) {
//we only load image if prev. URL and current URL do not match, or tag is null
ImageAware imageAware = new ImageViewAware(viewHolder.image, false);
imageLoader.displayImage(imageUri, imageAware,options);
viewHolder.image.setTag(imageUri);
}
答案 1 :(得分:0)
我有同样的问题。将ApplicationClass.java文件放在src文件夹中并将其注册到清单文件将解决您的问题。
以下是两个文件:
ApplicationClass.java
package yourPackageName;
import android.app.Application;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
public class ApplicationClass extends Application
{
@Override
public void onCreate() {
super.onCreate();
// UNIVERSAL IMAGE LOADER SETUP
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);
// END - UNIVERSAL IMAGE LOADER SETUP
}
}
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="yourPackageName">
<!--Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name="com.webcluesinfotech.loadimagefromurlinlistview.ApplicationClass"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
希望这会对你有所帮助。