android Okhttp 网络请求imageView 图片,显示在 ListView中
时间: 2024-03-11 13:49:10 浏览: 161
要在 ListView 中显示多张图片,可以使用 OkHttp 进行网络请求获取图片,并使用 ViewHolder 模式对 ListView 进行优化,以提高列表的滑动流畅性。具体实现步骤如下:
1. 在 Adapter 中定义 ViewHolder,用于缓存 item 中的控件:
```java
private static class ViewHolder {
ImageView imageView;
}
```
2. 在 getView() 方法中获取 ViewHolder,如果 convertView 为 null,则新建一个 ViewHolder,并使用 LayoutInflater 加载布局文件:
```java
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false);
holder = new ViewHolder();
holder.imageView = convertView.findViewById(R.id.image_view);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 加载图片并设置到 ImageView 中
loadImage(holder.imageView, imageUrlList.get(position));
return convertView;
}
```
3. 在 loadImage() 方法中使用 OkHttp 进行网络请求,获取图片并设置到 ImageView 中:
```java
private void loadImage(final ImageView imageView, String imageUrl) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(imageUrl)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
mHandler.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
});
}
```
其中,`imageUrlList` 是存储图片 URL 地址的列表,`mContext` 是 Context 对象,`mHandler` 是 Handler 对象,用于在子线程中更新 UI。首先创建一个 OkHttpClient 对象,然后使用 Request.Builder 构建一个请求,设置请求的 URL 地址。接着使用 `newCall(request).enqueue()` 方法异步执行请求,并在回调方法中获取响应的结果,将 InputStream 转换成 Bitmap,并使用 Handler 将 Bitmap 设置到 ImageView 中,以更新 UI。
需要注意的是,由于网络请求是异步执行的,因此需要使用 Handler 来更新 UI,否则会出现异常。
阅读全文