Android ImageView - 从URL加载图像

时间:2014-03-06 00:32:47

标签: android imageview image-loading

我有许多“联系”对象,每个对象都有一个与之关联的imageURL字符串。我所看到的将图像放入ListView的所有方法都涉及手动将图像放入“可绘制”文件夹并调用资源。手动输入图像会破坏这个目的。我已经提供了我的getView方法,注释掉的那行是我很困惑的。

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row = inflater.inflate(R.layout.single_row, parent, false);
    TextView name = (TextView) row.findViewById(R.id.topLine);
    TextView phone = (TextView) row.findViewById(R.id.secondLine);
    ImageView icon = (ImageView) row.findViewById(R.id.icon);

    name.setText(contactArray.get(position).getName());
    phone.setText((CharSequence) contactArray.get(position).getPhone().getWorkPhone());
    //icon.setImage from contactArray.get(position).getImageURL(); ????

    return row;
}

2 个答案:

答案 0 :(得分:26)

使用listView时,您应该异步加载图像,否则您的视图将被冻结并出现ANR。以下是一个完整的代码示例,它将异步加载图像 在自定义适配器中创建此类。

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) {
      bmImage.setImageBitmap(result);
  }
}

现在您可以非常轻松地加载图像,如下所示。

new ImageDownloader(imageView).execute("Image URL will go here");

不要忘记将以下权限添加到项目的Manifest.xml文件

<uses-permission android:name="android.permission.INTERNET" />

答案 1 :(得分:2)

像这样从URL加载图片。

URL url = new URL(contactArray.get(position).getImageURL());
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
icon.setImageBitmap(bmp);

也许如果您正在寻找更全面的方式并且您拥有非常大的数据集。我建议你使用Android-Universal-Image-Loader库。