我有许多“联系”对象,每个对象都有一个与之关联的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;
}
答案 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库。