在我的 Android 应用程序中,Asyntask 用于在 ListView 中从 Web 加载图像。我想显示图像的中心部分,并且我尝试过使用 imageloader 来加载图像,但问题是图像清晰度很差,但我已使用它来加载缩略图,因为缩略图非常小。所以我尝试了下面给出的 Asyntask。此方法的问题是 ImageView 显示其他图像,这意味着第一个列表项中的 ImageView 将显示下一个列表项的图像一段时间后它会显示正确的图像。我该如何解决这个问题。或者建议一种清晰地加载图像的方法。请帮助我。提前致谢
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
ProgressBar mProgressBar;
String url;
public DownloadImageTask(ImageView bmImage, ProgressBar progressBar) {
this.bmImage = bmImage;
this.mProgressBar = progressBar;
}
@Override
protected void onPreExecute() {
mProgressBar.setVisibility(View.VISIBLE);
super.onPreExecute();
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
url = urldisplay;
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
// Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
Utilities.addBitmapToMemoryCache(url, result);
bmImage.setImageBitmap(result);
mProgressBar.setVisibility(View.GONE);
// result.recycle();
}
}
}
public View getView(final int position, View convertView, ViewGroup parent) {
vi = convertView;
int type = getItemViewType(position);
// Utilities.message_player = new MediaPlayer();
if (vi == null) {
inflater = LayoutInflater.from(mcontext);
if (type == ITEM_TYPE_ONE)
vi = inflater.inflate(R.layout.message_group_list_item, null);
else
vi = inflater.inflate(R.layout.listlastrow, null);
}
if (type == ITEM_TYPE_ONE) {
if (fontType == true) {
}
((ImageView) vi.findViewById(R.id.imageMessage)).setTag(position+"i");
Bitmap bmp = Utilities.getBitmapFromMemCache(feedsImage);
if(bmp == null){
DownloadImageTask dwnloadImgTask = new DownloadImageTask(((ImageView) vi.findViewWithTag(position+"i")),
((ProgressBar) vi.findViewById(R.id.progressBar1)));
dwnloadImgTask.execute(feedsImage);
}else{
((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(bmp);
}
}
}
最佳答案
当您从缓存设置位图或下载新图像时,您会丢失一些内容:
您的父 View (vi) 可能是先前创建的 View ,已被回收以避免重新创建每个 View (这就是 convertView 的用途)。
此convertView上已经有一个图像,因为它是一个已加载图像的回收项目。
所以如果你有一个convertView,你必须重置 ImageView 内容:
((ImageView) vi.findViewById(R.id.imageMessage)).setTag(position+"i");
Bitmap bmp = Utilities.getBitmapFromMemCache(feedsImage);
if(bmp == null){
//HERE I add a line to reset the bitmap of the imageview
((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(null);
DownloadImageTask dwnloadImgTask = new DownloadImageTask(((ImageView) vi.findViewWithTag(position+"i")), ((ProgressBar) vi.findViewById(R.id.progressBar1)));
dwnloadImgTask.execute(feedsImage);
}else{
((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(bmp);
}
我已设置 null
来删除位图,但您可能想要设置一个占位符位图(例如带有重新加载图标的灰色图片或类似的东西...)
希望有帮助。
关于Android在 ListView 中加载图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17719884/