我使用了包含ImageView和TextView的ListView。我想从服务器获取图像。我调试下面的代码,告诉我可以使图像成功,但是当返回时,图像消失了。我不知道为什么。我是android的新手。希望有人能帮助我。
ListView适配器类:
public View getView(int position, View convertView, ViewGroup parent) {
News news = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
newsImage = (ImageView) view.findViewById(R.id.news_image);
newsTitle = (TextView) view.findViewById(R.id.news_title);
newsTitle.setText(news.getTitle());
bitmap = HttpUtil.sendImageRequest(news.getImageUrl());
newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage));
return view;
}
sendImageRequest方法:
public static Bitmap sendImageRequest(final String address){
final Bitmap[] bitmap = new Bitmap[1];
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
try {
connection = (HttpURLConnection) new URL(address).openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
InputStream in = connection.getInputStream();
bitmap[0] = BitmapFactory.decodeStream(in);
} catch (java.io.IOException e) {
e.printStackTrace();
} finally {
if (connection != null){
connection.disconnect();
}
}
}
}).start();
return bitmap[0];
}
ImageSolution方法:
public static Bitmap ImageSolution (Bitmap bitmap, ImageView imageView){
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int newWidth = imageView.getWidth();
int newHeight = imageView.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width,
height, matrix, true);
return resizedBitmap;
}
地址为http://p2.zhimg.com/10/7b/107bb4894b46d75a892da6fa80ef504a.jpg。
非常感谢你。
答案 0 :(得分:1)
您可以使用谷歌推荐的名为Glide的第三方库。要添加此库,请在模块应用程序的build.gradle文件中添加以下依赖项。
dependencies {
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
}
然后你可以按照以下方式简单地加载图片
Glide.with(context)
.load(news.getImageUrl())
.into(newsImage);
答案 1 :(得分:0)
为什么不使用Picasso库?
它真的很容易使用
Picasso.with(context).load(news.getImageUrl()).into(newsImage);
它提供缓存和图像转换。
答案 2 :(得分:0)
在适配器类中创建一个viewHolder类,
private static class ViewHolder {
public TextView newsTitle = null;
public ImageView newsImage = null;
}
然后编写你的getView代码,
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder itemHolder;
View view = convertView;
if (view == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
itemHolder = new ViewHolder();
view = inflater.inflate(layoutResID, parent, false);
itemHolder.newsImage = (ImageView) view.findViewById(R.id.news_image);
itemHolder.newsTitle = (TextView) view.findViewById(R.id.news_title);
view.setTag(itemHolder);
} else {
itemHolder = (viewHolder) view.getTag();
}
News news = getItem(position);
itemHolder.newsTitle.setText(news.getTitle());
bitmap = HttpUtil.sendImageRequest(news.getImageUrl());
itemHolder.newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage));
return view;
}
或者,你可以使用毕加索,它很容易使用......
在依赖项中添加此行,
compile 'com.squareup.picasso:picasso:2.5.0'
用于加载用于加载图像的图像代码,
Picasso.with(context).load(news.getImageUrl()).into(itemHolder.newsImage);
答案 3 :(得分:0)
bitmap = HttpUtil.sendImageRequest(news.getImageUrl());
位图将始终为空,因为它是图像请求。该函数启动一个线程但立即返回。所以返回一个空位图。
newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage));
如果您尝试将该空位图设置为imageview,则会出错。
重新设计您的应用。只有当线程完成时才有一个有效的位图。然后你可以使用它。