使用通用图像加载器在Android网格视图中滚动时重复图像
我正在尝试使用下面的代码在gridview上使用通用图像加载器从Internet加载图像使用通用图像加载器在Android网格视图中滚动时重复图像,android,image,gridview,universal-image-loader,Android,Image,Gridview,Universal Image Loader,我正在尝试使用下面的代码在gridview上使用通用图像加载器从Internet加载图像 public View getView(int position, View converView, ViewGroup parent) { Log.v("Description", "Description is " + position); ViewHolder mVHolder; if (converView == null) {
public View getView(int position, View converView, ViewGroup parent) {
Log.v("Description", "Description is " + position);
ViewHolder mVHolder;
if (converView == null) {
LayoutInflater vi = (LayoutInflater) conted.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
converView = vi.inflate(R.layout.customgrid, null);
mVHolder = new ViewHolder();
mVHolder.mImageView = (ImageView) converView
.findViewById(R.id.imgview);
mVHolder.mTextView1 = (TextView) converView
.findViewById(R.id.textView1);
mVHolder.mTextView2 = (TextView) converView
.findViewById(R.id.textView2);
mVHolder.mTextView3 = (TextView) converView
.findViewById(R.id.textView3);
converView.setTag(mVHolder);
} else {
mVHolder = (ViewHolder) converView.getTag();
}
// mVHolder.mImageView.setImageResource(mThumbIds[position]);
// mVHolder.mImageView.setImageDrawable(LoadImageFromURL(
// mThumbIds[position]));
imageLoader.displayImage(mThumbIds[position],mVHolder.mImageView,options, animationListener);
Log.v("Names",NAMES[position] + STATES[position] + CONSTITUENCY[position]);
mVHolder.mTextView1.setText(NAMES[position]);
mVHolder.mTextView2.setText(STATES[position]);
mVHolder.mTextView3.setText(CONSTITUENCY[position]);
return converView;
}
然而,当我在列表中向下滚动时,第一行的第一个图像似乎在大多数网格中重复。它不会一直停留在屏幕上,而是在一段时间后变回原始图像。我的问题是,这是gridview上的视图膨胀问题还是Universal image Loader的图像加载问题?我认为您的问题是您没有为
DisplayImageOptions
设置resetViewBeforeLoading()
方法,如下所示:-
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_image)
.showImageForEmptyUri(R.drawable.image_for_empty_url)
----> .resetViewBeforeLoading(true)<----very important for recycling views
.cacheInMemory()
.cacheOnDisc()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.delayBeforeLoading(1000)
.displayer(new SimpleBitmapDisplayer()) // default
.build();
另一种解决方案是使用setTag()来标识视图:
class ViewHolder {
ImageView thumbnail;
public boolean isSameView(String tag) {
if (tag == null) {
return thumbnail.getTag() == null;
}
return tag.equals(thumbnail.getTag());
}
}
protected void imageLoader(ViewHolder holder, String imageUrl) {
if (!holder.isSameView(imageUrl)) { // If image is loaded correctly skip else reload and set new image
holder.thumbnail.setTag(imageUrl);
imageLoader.displayImage(imageUrl, holder.thumbnail, new SimpleImageLoadingListener() {@
Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
view.setTag(failReason.getType().name()); // You can handle errors and avoid repeating requests that return error codes
}
});
}
}
imageLoader是什么?@user3431672,imageLoader是通用的图像加载器,看起来它和适配器有关。为了进行测试,请尝试删除视图循环,并查看图像是否正确显示。它会很慢,滚动会很慢。但它应该能让我们知道哪里有问题。我们应该很好地进行调试。这不完全是事实,但它是相关的,我已经删除了showStubImage(R.drawable.stub_图像)以查看效果,但忘记了…现在添加了,它没有重复图像谢谢。也为我解决了它!但是,上述内容不受欢迎。Git Hub页面上有更新的版本。嗨,我也有类似的问题。我尝试了此解决方案,但问题仍然没有解决。对于大型图像,在加载之前使用ResetViewPre是个坏主意。
class ViewHolder {
ImageView thumbnail;
public boolean isSameView(String tag) {
if (tag == null) {
return thumbnail.getTag() == null;
}
return tag.equals(thumbnail.getTag());
}
}
protected void imageLoader(ViewHolder holder, String imageUrl) {
if (!holder.isSameView(imageUrl)) { // If image is loaded correctly skip else reload and set new image
holder.thumbnail.setTag(imageUrl);
imageLoader.displayImage(imageUrl, holder.thumbnail, new SimpleImageLoadingListener() {@
Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
view.setTag(failReason.getType().name()); // You can handle errors and avoid repeating requests that return error codes
}
});
}
}