我正在创建一个用于从网上加载图片的应用程序。我正在使用Recyclerview进行上市。为了下载图像,我尝试了毕加索,通用图像下载和其他自定义方法,但我遇到了这个问题:
每当我向下滚动时,imageview中的图像都会重新加载。我甚至保留了一个条件来检查imageview是否包含图像,但是它似乎也没有用,或者我的代码可能有问题。但我无法找到解决这个问题的方法。下面我附上了' onBindViewHolder'我认为代码的功能是有问题的部分。这里的图像是一个包含图像网址的字符串arraylist。
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.default_card, parent, false);
ViewHolder viewHolder;
viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String url = images.get(position);
if (holder.imgView.getDrawable() != null) {
//Do Nothing
} else {
ImageLoader.getInstance().displayImage(url, holder.imgView);
}
}
答案 0 :(得分:3)
您可以将.fit()
与Picasso一起使用。希望能解决您的问题
Picasso.with(persons.get(i).context)
.load(persons.get(i).photoId)
.placeholder(R.drawable.placeholder)
.fit()
.into(personPhoto);
答案 1 :(得分:2)
首先,您的代码中存在错误 - 您必须从onBindViewHolder
中删除该条件。每次要显示时,都必须更新所有ImageView
个实例。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String url = images.get(position);
ImageLoader.getInstance().displayImage(url, holder.imgView);
}
重新加载部分:
问题是,您可能没有使用任何缓存(内存或基于磁盘)。我不会对此进行详细说明,在集合视图中缓存图像是一个非常常见的问题,我确信快速的StackOverflow搜索会给你带来很多结果。
特别是 - 通用图片does not have caching enabled by default您可以通过这种方式转换它。
DisplayImageOptions options = new DisplayImageOptions.Builder()
...
.cacheInMemory(true)
.cacheOnDisk(true)
...
.build();
ImageLoader.getInstance().displayImage(imageUrl, imageView, options); // Incoming options will be used
或者您可以为您的应用程序全局设置它,只需查看文档。
答案 2 :(得分:0)
如果您不想使用缓存,可以使用setItemViewCacheSize(size)并提及您不想重新加载的大小。就是这样。 Recyclerview版本24.0.0
答案 3 :(得分:0)
您可以使用它来解决您的问题。
mRecyclerView.getRecycledViewPool().setMaxRecycledViews(0, 0);