请求网络数据,把解析出来的数据放到ListView上面

首先给大家看一下效果:
这是有网的状态
这是有网的状态
这是没有网络的状态
在这里插入图片描述
好了,代码如下:
MainActivity里面的代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener, MyAsyncTask.CallBacks {

    private Button btn;
    private ListView listv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //第一步:找控件设置监听
        btn = findViewById(R.id.btn);
        listv = findViewById(R.id.list);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            //第二步:点击事件
            case R.id.btn:
                //第三步  创建MyAsyncTask类
                //-------------------------------
                //第八步创建MyAsyncTask对象
                MyAsyncTask task=new MyAsyncTask();
                //第九步:注册接口
                task.setCal(MainActivity.this);
                //第十步:请求数据(参数:接口)
                task.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
                //这个时候开始请求数据,数据请求完成后会返回返回到接口回调的方法中
                break;
        }
    }

    @Override
    public void getData(String st) {
        //第十一步:实现接口MyAsyncTask.CallBackS ,得到getData方法
        //第十二步:得到接口回调返回的数据-->str
        //第十三步:解析
        Gson gson=new Gson();
        JsonBean bean = gson.fromJson(st, JsonBean.class);
        //获取集合
        ArrayList<Datas> data = bean.getData();
        //第十四步:设置适配器
        listv.setAdapter(new MyAdapter(MainActivity.this,data));
    }
}

Http文件夹下面的http代码:

public class Http {
    /**
     * 请求数据GET请求
     */
    public static String requestHttpGet(String strUrl){
        try {
            //设置url
            URL url=new URL(strUrl);
            //获取HttpURLConnection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //设置为get请求
            connection.setRequestMethod("GET");
            //设置连接主机超时时间
            connection.setConnectTimeout(5000);
            //设置从主机读取数据超时
            connection.setReadTimeout(5000);
            //获取请求码(来判断网络请求是否正确)
            int code = connection.getResponseCode();
            //判断请求是否成功
            //请求码200相等于 HttpURLConnection.HTTP_OK
            if(code==200){
                //如果数据请求成功
                //就获取数据
                InputStream stream = connection.getInputStream();
                BufferedReader reader=new BufferedReader(new InputStreamReader(stream,"utf-8"));
                //拼接字符串
                StringBuilder builder=new StringBuilder();
                //把数据读取从成字符串
                String str="";
                while ((str=reader.readLine())!=null){
                    //把一行行数据拼接成一行数据
                    builder.append(str);
                }
                //返回拼接后的数据
                return builder.toString();
            }
            //关闭连接
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

Http文件夹下面的MyAsyncTask代码

//第一个泛型 代表你要给子线程传的东西
//第二个泛型 代表任务执行的进度  用Integer
//第三个泛型 代表解析完成后子线程返回的值,以及主线程接受的值
//===================================
///第四:继承AsyncTask,然后写三个泛型,< String,Integer,String>
public class MyAsyncTask extends AsyncTask<String,Integer,String> {

    @Override
    protected String doInBackground(String... strings) {
        //代表子线程
        //第五步:利用子线程请求数据
        return Http.requestHttpGet(strings[0]);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        //主线程
        //5调用
        cal.getData(s);
    }

    //第六步:接口回调=================第七部/:进入MainActivity
    //1创建接口
    public interface CallBacks{
        //2抽象方法
        void getData(String st);
    }
    //3写个属性
    private CallBacks cal;
    //4写一个set方法
    public void setCal(CallBacks cal) {
        this.cal = cal;
    }
}

app文件夹下的App代码:

//第十六部:创建自己的Application,然后继承Application
public class App extends Application {
    //第十七部:注册 Application
    @Override
    public void onCreate() {
        super.onCreate();
        //第十八部:设置框架的一些属性,然后初始化  ImageLoader
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                // 正在加载时显示的占位图
                .showImageOnLoading(R.mipmap.zhan)
                // 加载失败时显示的占位图
                .showImageOnFail(R.mipmap.shibai)
                // bitmap的质量,默认为ARGB_8888
                .bitmapConfig(Bitmap.Config.ARGB_8888)
                .build();
        //1构建
        ImageLoaderConfiguration loaderConfiguration=new ImageLoaderConfiguration.Builder(this)
                //把我们写的设置添加到构建中
                .defaultDisplayImageOptions(options)
                //构建
                .build();
        //获得实例
        ImageLoader imageLoader=ImageLoader.getInstance();
        //初始化
        imageLoader.init(loaderConfiguration);
//初始化完成后进入适配器加载图片
    }
}

适配器(adapter)的代码:

public class MyAdapter extends BaseAdapter {
    private Context con;
    private ArrayList<Datas> arr;

    public MyAdapter(Context con, ArrayList<Datas> arr) {
        this.con = con;
        this.arr = arr;
    }

    @Override
    public int getCount() {
        return arr.size();
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder vh;
        if(view==null){
            view=LayoutInflater.from(con).inflate(R.layout.item,null);
            vh=new ViewHolder();
            vh.name=view.findViewById(R.id.name);
           vh.img=view.findViewById(R.id.image);
            view.setTag(vh);
        }else{
            vh= (ViewHolder) view.getTag();
        }
        vh.name.setText(arr.get(i).getNews_title());
        //第十五步 请求图片
        //请求图片需要在Application中注册
        ///在你自己的项目中 build.gradle(   : 你项目的名字)
        // implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
        //然后新建一个App的类
        String url = arr.get(i).getPic_url();
        //第十九部:请求图片(参数:1.图片接口 ,2 imageview的控件)
        ImageLoader.getInstance().displayImage(url,vh.img);
        //完成
        //注意 网络权限
        return view;
    }
    static class ViewHolder{
        TextView name;
        ImageView img;
    }
}

注意,注意, 权限 权限不写上的话 运行不出来

AndroidManifest.xml里面注册一个网络权限

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

里面还要注册一个 就是在application里面写一个android:name=".app.App"
图片要放在res/mipmap-hdpi里面

还有最重要一步:在Gradle Scripts里面找到自己的项目 例如:build.gradle(Module:day02)然后点击之后把
implementation ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’
复制进去就OK了

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值