获取网络图片展示到ListView上

来源:互联网 发布:php 接口开发框架 编辑:程序博客网 时间:2024/06/10 02:09

请求网络工具类

package com.wzq.listviewimage;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
* NetWorkUtil是我们自己封装的请求网络工具类
* 可以请求json字符串并返回
* 可以请求图片并返回
*/

public class NetWorkUtil {private int responseCode;/** * 获取图片并返回; * @param urlString * @return */public Bitmap getNetImage(String urlString){    try {        //得到URL对象,这个对象可以打开连接        URL url = new URL(urlString);        //打开连接,HttpURLConnection:是URLConnection的子类;子类的方法比较多;都用子类        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();        //服务器返回的状态码        int responseCode = urlConnection.getResponseCode();        //请求成功        if (responseCode == 200){            InputStream inputStream = urlConnection.getInputStream();            //BitmapFactory类封装了好多关于图片处理的方法;            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);            return  bitmap;        }else {            Log.e("wzq请求图片","responseCode:"+ responseCode);        }    } catch (MalformedURLException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }    return null;}/** * 请求json字符串并返回, * @param urlString url * @return   json字符串 */public String getNetString(String urlString){    try {        //得到URL对象,这个对象可以打开连接        URL url = new URL(urlString);        //打开连接,HttpURLConnection:是URLConnection的子类;子类的方法比较多;都用子类        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();        //服务器返回的状态码        int responseCode = urlConnection.getResponseCode();        //请求成功        if (responseCode == 200){            InputStream inputStream = urlConnection.getInputStream();            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));            StringBuilder stringBuilder = new StringBuilder();            String stringTemp = "";            while ((stringTemp = bufferedReader.readLine()) != null) {                stringBuilder.append(stringTemp);            }            String result = stringBuilder.toString();            Log.e("wzq请求json", "result:" + result);            return result;        }else {            Log.e("wzq","responseCode:"+ responseCode);        }    } catch (MalformedURLException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }    return null;    }}

封装Bean类

package com.wzq.listviewimage;

import java.util.List;

public class Student {

private String info;private int status;private List<DataBean> data;public String getInfo() {    return info;}public void setInfo(String info) {    this.info = info;}public int getStatus() {    return status;}public void setStatus(int status) {    this.status = status;}public List<DataBean> getData() {    return data;}public void setData(List<DataBean> data) {    this.data = data;}public static class DataBean {    private String news_id;    private String news_summary;    private String news_title;    private String pic_url;    public String getNews_id() {        return news_id;    }    public void setNews_id(String news_id) {        this.news_id = news_id;    }    public String getNews_summary() {        return news_summary;    }    public void setNews_summary(String news_summary) {        this.news_summary = news_summary;    }    public String getNews_title() {        return news_title;    }    public void setNews_title(String news_title) {        this.news_title = news_title;    }    public String getPic_url() {        return pic_url;    }    public void setPic_url(String pic_url) {        this.pic_url = pic_url;        }    }}

主界面

package com.wzq.listviewimage;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.List;

/**
* Gson依赖:compile ‘com.google.code.gson:gson:2.8.1’
*/

public class MainActivity extends AppCompatActivity {private ListView lv;List<Student.DataBean> lists = new ArrayList<>();private MAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    lv = (ListView) findViewById(R.id.lv);    mAdapter = new MAdapter();    initData();}/** * 请求网络数据 */private void initData() {    //记得要在子线程中写    new MAsyncTaskString().execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");}class MAdapter extends BaseAdapter {    @Override    public int getCount() {        return lists.size();    }    @Override    public Object getItem(int i) {        return lists.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    @Override    public View getView(int i, View containerView, ViewGroup viewGroup) {        View view = View.inflate(MainActivity.this, R.layout.list_item, null);        ImageView iv = (ImageView) view.findViewById(R.id.iv);        //把图片url传递给asyncTask        new MAsyncTaskImage(iv).execute(lists.get(i).getPic_url());        return view;    }}/** * alt+insert 自动选择要实现的方法等等 * 第一个参数表示要执行的任务通常是网络的路径 * 第二个参数表示进度Integer * 第三个参数表示任务执行的返回结果 */ //请求图片class MAsyncTaskImage extends AsyncTask<String, Void, Bitmap> {    ImageView iv;    public MAsyncTaskImage(ImageView imageView) {        this.iv = imageView;    }    //这个是请求网络之前的调用的方法,也是最先调用的方法,可以初始化一些ui等;这个方法是在主线程里运行的    @Override    protected void onPreExecute() {        super.onPreExecute();    }    /**     * String... strings--->这个是可变参数;     * 这个方法是在后台执行的,不能更新ui,是子线程     * 这个方法的返回值会返回给     */    @Override    protected Bitmap doInBackground(String... strings) {        return new NetWorkUtil().getNetImage(strings[0]);    }    /**     * 这个方法是运行在主线程的     * 当doInBackground执行完, 会自动回调这个方法,来更新ui;     * @param bitmap     */    @Override    protected void onPostExecute(Bitmap bitmap) {        super.onPostExecute(bitmap);        iv.setImageBitmap(bitmap);    }    //主线程可以更新ui;    @Override    protected void onProgressUpdate(Void... values) {        super.onProgressUpdate(values);    }}//请求字符串class MAsyncTaskString extends AsyncTask<String, Void, String> {    //这个是请求网络之前的调用的方法,也是最先调用的方法,可以初始化一些ui等;这个方法是在主线程里运行的    @Override    protected void onPreExecute() {        super.onPreExecute();    }    /**     * String... strings--->这个是可变参数;     * 这个方法是在后台执行的,不能更新ui,是子线程     * 这个方法的返回值会返回给     */    /**     * 调用urlconnectiong获取json字符串     * @param strings     * @return     */    @Override    protected String doInBackground(String... strings) {        return new NetWorkUtil().getNetString(strings[0]);    }    /**     * 这个方法是运行在主线程的     * 当doInBackground执行完, 会自动回调这个方法,来更新ui;     */    @Override    protected void onPostExecute(String netString) {        super.onPostExecute(netString);        Gson gson = new Gson();        Student student = gson.fromJson(netString, Student.class);        lists = student.getData();        lv.setAdapter(mAdapter);    }    //主线程可以更新ui;    @Override    protected void onProgressUpdate(Void... values) {        super.onProgressUpdate(values);        }    }}

布局

<ListView    android:id="@+id/lv"    android:layout_width="match_parent"    android:layout_height="400dp"    tools:layout_editor_absoluteX="8dp"    tools:layout_editor_absoluteY="8dp"></ListView>

item布局

<ImageView    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/iv"    android:layout_width="match_parent"    android:layout_height="80dp"/>

记得加联网权限和Gson依赖