在这种情况下,如何在android中清除图像视图?
在getview()适配器内部,但它似乎没有按预期工作,如何修复它?感谢当异步任务下载映像时,适配器可能会回收视图保持架,因此异步任务将错误的映像设置到视图保持架实例在这种情况下,如何在android中清除图像视图?,android,listview,android-asynctask,adapter,Android,Listview,Android Asynctask,Adapter,在getview()适配器内部,但它似乎没有按预期工作,如何修复它?感谢当异步任务下载映像时,适配器可能会回收视图保持架,因此异步任务将错误的映像设置到视图保持架实例 您需要注意,异步任务将位图分配给有效的视图持有者,而不是陈旧的视图持有者。谢谢您的回答。这就是我遇到的问题。您是否介意提供一些示例或方法来执行此操作?例如,在执行后,检查什么条件并执行某些操作?我认为这是正确的。您可能应该向ViewHolder类添加一个AtomicBoolean,该类指示视图是否正在等待图像,如果该标志为true
您需要注意,异步任务将位图分配给有效的视图持有者,而不是陈旧的视图持有者。谢谢您的回答。这就是我遇到的问题。您是否介意提供一些示例或方法来执行此操作?例如,在执行后,检查什么条件并执行某些操作?我认为这是正确的。您可能应该向ViewHolder类添加一个AtomicBoolean,该类指示视图是否正在等待图像,如果该标志为true,则不重用该视图。在post execute方法中,您将标志设置为false。是的,您应该缓存图像,以便下次上下滚动并下载之前下载的相同图像时,view holder会过时。您可以使用Google提供的Volley库,它提供了在文件系统上缓存图像的良好功能
private static class ViewHolder {
ImageView imageView;
TextView region;
TextView area;
TextView id;
TextView shop_name;
public String imageURL;
public Bitmap bitmap;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO
ViewHolder viewHolder = null;
if (arg1 == null) {
arg1 = myInflater.inflate(R.layout.details, arg2, false);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) arg1.findViewById(R.id.imageView1);
viewHolder.region = (TextView) arg1.findViewById(R.id.textView1);
viewHolder.area = (TextView) arg1.findViewById(R.id.textView2);
viewHolder.id = (TextView) arg1.findViewById(R.id.textView3);
viewHolder.shop_name = (TextView) arg1.findViewById(R.id.textView4);
arg1.setTag(viewHolder);
}
viewHolder = (ViewHolder)arg1.getTag();
viewHolder.imageView.setImageResource(R.drawable.loading);
ShopEntry entry = getItem(arg0);
viewHolder.imageURL = entry.image_url;
viewHolder.region.setText(entry.region);
viewHolder.area.setText(entry.area);
viewHolder.id.setText(entry.id);
viewHolder.shop_name.setText(entry.shop_name);
new DownloadAsyncTask().execute(viewHolder);
return arg1;
}
private class DownloadAsyncTask extends AsyncTask<ViewHolder, Void, ViewHolder> {
@Override
protected ViewHolder doInBackground(ViewHolder... params) {
// TODO Auto-generated method stub
//load image directly
ViewHolder viewHolder = params[0];
try {
URL imageURL = new URL(viewHolder.imageURL);
viewHolder.bitmap = BitmapFactory.decodeStream(imageURL.openStream());
} catch (IOException e) {
// TODO: handle exception
Log.e("test", "Downloading Image Failed");
viewHolder.bitmap = null;
}
return viewHolder;
}
@Override
protected void onPostExecute(ViewHolder result) {
// TODO Auto-generated method stub
if (result.bitmap == null) {
result.imageView.setImageResource(R.drawable.loading);
} else {
result.imageView.setImageBitmap(result.bitmap);
}
}
}
viewHolder.imageView.setImageResource(R.drawable.loading);