【发布时间】:2015-07-30 22:20:27
【问题描述】:
我正在尝试将图像从 URL 下载到列表视图中。当我滚动或列表填充图像时,图像会闪烁并且不在正确的行上..
这是我的适配器代码:
public class RecipesAdapter extends ArrayAdapter<XmlDataCollected> {
// View lookup cache
private static class ViewHolder {
static ImageView img;
TextView name;
TextView info;
ImageDownloader controller;
}
public RecipesAdapter(Context context, List<XmlDataCollected> recipes) {
super(context, R.layout.fragment_search_result, recipes);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
XmlDataCollected recipe = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.fragment_search_result, parent, false);
viewHolder.name = (TextView) convertView.findViewById(R.id.label);
viewHolder.info = (TextView) convertView.findViewById(R.id.info);
ViewHolder.img = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.img.setImageBitmap(null);
}
if (viewHolder.controller != null) {
viewHolder.controller.cancel(false);
}
viewHolder.controller = new ImageDownloader(viewHolder.img);
if (viewHolder.controller != null) {
viewHolder.controller.execute(recipe.getImgUrl());
}
// Populate the data into the template view using the data object
viewHolder.name.setText(recipe.getRecipeName());
if(recipe.getType() != null) {
viewHolder.info.setText(recipe.getType());
}
else {
viewHolder.info.setText("Unknown category");
}
//new ImageDownloader(viewHolder.img).execute(recipe.getImgUrl());
// Return the completed view to render on screen
return convertView;
}
public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public ImageDownloader(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String url = urls[0];
Bitmap mIcon = null;
try {
InputStream in = new java.net.URL(url).openStream();
mIcon = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
}
return mIcon;
}
protected void onPostExecute(Bitmap result) {
if(result != null) {
bmImage.setImageBitmap(result);
}
else{
bmImage.setImageResource(R.drawable.ic_launcher);
}
}
}
}
【问题讨论】:
-
有一些库可以从 github.com/mcxiaoke/android-volley 或 square.github.io/picasso 这样的 url 下载缓存图像。这些将帮助您编写更少的代码并更好地工作。但我认为您仍然需要跟踪请求并停止下载超出视野的行的图像。