使用 Universal Image Loader Android 在 ListView 中加载错误图像?
Load wrong image in ListView using Universal Image Loader Android?
我有一个列表包含:contentString 和列表图像,它看起来像:
[{
"contentString": "Image",
"images": [{
"image": "url"
}]
}, {...}]
然后我尝试在 ListView
中加载它。
我的持有人:
class Holder {
TextView Content;
ImageView ImageButton;
ImageLoader imageLoaderPost;
public Holder(TextView Content, ImageView ImageButton, ImageLoader imageLoader) {
this.Content = Content;
this.ImageButton = ImageButton;
this.imageLoaderPost = imageLoader;
}
}
在 ListView 中加载视图:
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
final Holder holder;
if (v == null) {
v = inflater.inflate(R.layout.activity_row, parent, false);
TextView Content = (TextView) v.findViewById(R.id.ContentTextView);
ImageView ImageButton = (ImageView) v.findViewById(R.id.ImageButton);
ImageLoader imageLoaderPost = ImageLoader.getInstance();
holder = new Holder(Content, ImageButton, imageLoaderPost);
v.setTag(holder);
} else {
holder = (Holder) v.getTag();
}
final HTPost post = postList.get(position);
// post content
holder.postContent.setText(post.getContentString());
//
DisplayImageOptions options = new DisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.considerExifParams(true)
.resetViewBeforeLoading(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
// image
if (post.getImages().size() > 0) {
holder.imageLoaderPost.displayImage(post.getImages().get(0).getImage(), holder.postImageButton, options, new ImageLoadingListener() {@Override
public void onLoadingStarted(String s, View view) {
}
@Override
public void onLoadingFailed(String s, View view, FailReason failReason) {}
@Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
}
@Override
public void onLoadingCancelled(String s, View view) {}
});
} else {
//holder.imageLoaderPost.cancelDisplayTask(holder.postImageButton);
log("Wrong image: " + post.getContentString());
}
return v;
}
行没有图像,我只加载 contentString 并打印:log("Wrong image: " + post.getContentString());
但在 ListView
中,我看到一张图片加载了内容。 (行无图但有图在ListView
,图片与之前加载的所有图片中的1重合)
我不知道为什么,也许是 ImageLoader
的缓存?
任何帮助,谢谢!
您正在使用 ViewHolder,因此 ListView
中的行将被重复使用而无需重复重新创建。
因此,您将在所有行中都有图像。
简单的解决方法是在不需要的行中隐藏ImageView
if(your condition){
...
holder.ImageButton.setVisibility(View.VISIBLE);
... load your image
...
} else {
log("Wrong image: " + post.getContentString());
holder.ImageButton.setVisibility(View.INVISIBLE); //hide your ImageView or you can load default image
}
希望对您有所帮助
要从服务器异步加载图像,您可以使用 Picasso small library.It 只是一行代码。这里是gradle
compile 'com.squareup.picasso:picasso:2.3.3'
这是您的 ImageView
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
这是简单的 java 代码
ImageView imageView = (ImageView) findViewById(R.id.imageView);
Picasso.with(this)
.load("YOUR_IMAGE_URL")
.into(imageView);
就是这样。有关详细信息,请访问 here
我有一个列表包含:contentString 和列表图像,它看起来像:
[{
"contentString": "Image",
"images": [{
"image": "url"
}]
}, {...}]
然后我尝试在 ListView
中加载它。
我的持有人:
class Holder {
TextView Content;
ImageView ImageButton;
ImageLoader imageLoaderPost;
public Holder(TextView Content, ImageView ImageButton, ImageLoader imageLoader) {
this.Content = Content;
this.ImageButton = ImageButton;
this.imageLoaderPost = imageLoader;
}
}
在 ListView 中加载视图:
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
final Holder holder;
if (v == null) {
v = inflater.inflate(R.layout.activity_row, parent, false);
TextView Content = (TextView) v.findViewById(R.id.ContentTextView);
ImageView ImageButton = (ImageView) v.findViewById(R.id.ImageButton);
ImageLoader imageLoaderPost = ImageLoader.getInstance();
holder = new Holder(Content, ImageButton, imageLoaderPost);
v.setTag(holder);
} else {
holder = (Holder) v.getTag();
}
final HTPost post = postList.get(position);
// post content
holder.postContent.setText(post.getContentString());
//
DisplayImageOptions options = new DisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.considerExifParams(true)
.resetViewBeforeLoading(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
// image
if (post.getImages().size() > 0) {
holder.imageLoaderPost.displayImage(post.getImages().get(0).getImage(), holder.postImageButton, options, new ImageLoadingListener() {@Override
public void onLoadingStarted(String s, View view) {
}
@Override
public void onLoadingFailed(String s, View view, FailReason failReason) {}
@Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
}
@Override
public void onLoadingCancelled(String s, View view) {}
});
} else {
//holder.imageLoaderPost.cancelDisplayTask(holder.postImageButton);
log("Wrong image: " + post.getContentString());
}
return v;
}
行没有图像,我只加载 contentString 并打印:log("Wrong image: " + post.getContentString());
但在 ListView
中,我看到一张图片加载了内容。 (行无图但有图在ListView
,图片与之前加载的所有图片中的1重合)
我不知道为什么,也许是 ImageLoader
的缓存?
任何帮助,谢谢!
您正在使用 ViewHolder,因此 ListView
中的行将被重复使用而无需重复重新创建。
因此,您将在所有行中都有图像。
简单的解决方法是在不需要的行中隐藏ImageView
if(your condition){
...
holder.ImageButton.setVisibility(View.VISIBLE);
... load your image
...
} else {
log("Wrong image: " + post.getContentString());
holder.ImageButton.setVisibility(View.INVISIBLE); //hide your ImageView or you can load default image
}
希望对您有所帮助
要从服务器异步加载图像,您可以使用 Picasso small library.It 只是一行代码。这里是gradle
compile 'com.squareup.picasso:picasso:2.3.3'
这是您的 ImageView
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
这是简单的 java 代码
ImageView imageView = (ImageView) findViewById(R.id.imageView);
Picasso.with(this)
.load("YOUR_IMAGE_URL")
.into(imageView);
就是这样。有关详细信息,请访问 here