在我的Android应用程序中,一个Asyntask用于以列表视图的形式从Web加载图像。我想显示图像的中心部分,我曾尝试使用imageloader加载图像,但问题是图像清晰度很差,但我使用了它用于加载缩略图,因为缩略图很小。因此,我尝试了下面给出的Asyntask。此方法的问题是图像视图显示了其他图像,这意味着第一个列表项中的图像视图将显示下一个列表项的图像,并在显示某些图像后时间将显示正确的图像。如何解决此问题。或建议一种使图像清晰的方法。请帮助我。在此先感谢您
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);
}
}
}
当您从缓存中设置位图或下载新图像时,您丢失了一些东西:
您的父视图(vi)可能是先前创建的视图,可以循环使用,以避免重新创建每个视图(convertView的作用)。
这个convertView上已经有图像,因为它是已加载图像的回收物品。
因此,如果您有一个convertView,则必须重置图像视图的内容:
((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
为删除位图,但您可能想设置一个占位符位图(例如上面带有重新加载图标的灰色图片或类似的东西...)
希望能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句