package com.qy.day02;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.qy.day02.adapter.MyAdapter;
import com.qy.day02.bean.JsonBean;
import com.qy.day02.http.MyAsyncTask;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, MyAsyncTask.CallBackS {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找控件设置值监听
findViewById(R.id.button2).setOnClickListener(this);
listView = findViewById(R.id.listView);
}
@Override
public void getData(String str) {
//实现接口MyAsyncTask.CallBackS ,得到getData方法
//得到接口回调返回的数
//解析
Gson gson = new Gson();
JsonBean jsonBean = gson.fromJson(str, JsonBean.class);
//获取集合
ArrayList<JsonBean.DataBean> data = jsonBean.getData();
//设置适配器
listView.setAdapter(new MyAdapter(data, MainActivity.this));
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//点击事件
case R.id.button2:
//创建MyAsyncTask类
//创建MyAsyncTask对象
MyAsyncTask task = new MyAsyncTask();
//第九部:6 注册接口
task.setmCallbackS(MainActivity.this);
//请求数据(参数 : 接口 )
task.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
//这个时候开始请求数据,数据请求完成后会返回返回到接口回调的方法中
break;
}
}
}
AsyncTask类如下:
package com.qy.day02.http;
import android.os.AsyncTask;
import javax.security.auth.callback.Callback;
//第一个 代表你要给子线程传的东西
//第二个 代表任务执行的进度 用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);
//主线程
mCallbackS.getData(s);
}
//创建接口
public interface CallBackS{
//抽象方法
void getData(String str);
}
//写个属性
private CallBackS mCallbackS;
//写一个set方法
public void setmCallbackS(CallBackS mCallbackS) {
this.mCallbackS = mCallbackS;
}
}
http类如下:
package com.qy.day02.http;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Http {
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();
//判断请求是否成功
if (code == HttpURLConnection.HTTP_OK) {
//如果数据请求成功
//就获取数据
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;
}
}
Bean类如下:
package com.qy.day02.bean;
import java.util.ArrayList;
import java.util.List;
public class JsonBean {
private int status;
private String info;
private ArrayList<DataBean> data;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public ArrayList<DataBean> getData() {
return data;
}
public void setData(ArrayList<DataBean> data) {
this.data = data;
}
public static class DataBean {
private String news_id;
private String news_title;
private String news_summary;
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_title() {
return news_title;
}
public void setNews_title(String news_title) {
this.news_title = news_title;
}
public String getNews_summary() {
return news_summary;
}
public void setNews_summary(String news_summary) {
this.news_summary = news_summary;
}
public String getPic_url() {
return pic_url;
}
public void setPic_url(String pic_url) {
this.pic_url = pic_url;
}
}
}
App类如下:
package com.qy.day02.app;
import android.app.Application;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.qy.day02.R;
public class App extends Application {
//注册 Application
@Override
public void onCreate() {
super.onCreate();
//设置框架的一些属性,然后初始化 ImageLoader
DisplayImageOptions options = new DisplayImageOptions.Builder()
// 正在加载时显示的占位图
.showImageOnLoading(R.mipmap.zhan)
// // URL为空时显示的占位图
// .showImageForEmptyUri(R.mipmap.zhaobudao)
// 加载失败时显示的占位图
.showImageOnFail(R.mipmap.shibai)
// //可在实现中对 bitmap 做一些额外处理,比如加圆角、动画效果。
// .displayer(new SimpleBitmapDisplayer())
// bitmap的质量,默认为ARGB_8888
.bitmapConfig(Bitmap.Config.ARGB_8888)
.build();
//构建
ImageLoaderConfiguration loaderConfiguration = new ImageLoaderConfiguration.Builder(this)
//把我们写的设置添加到构建中
.defaultDisplayImageOptions(options)
//构建
.build();
//获得实例
ImageLoader imageLoader = ImageLoader.getInstance();
//初始化
imageLoader.init(loaderConfiguration);
}
}
Adapter适配器如下:
package com.qy.day02.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.qy.day02.R;
import com.qy.day02.bean.JsonBean;
import java.util.ArrayList;
public class MyAdapter extends BaseAdapter {
private ArrayList<JsonBean.DataBean> list;
private Context context;
public MyAdapter(ArrayList<JsonBean.DataBean> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = View.inflate(context, R.layout.item, null);
ImageView imageView = convertView.findViewById(R.id.imageView);
TextView textView = convertView.findViewById(R.id.textView);
JsonBean.DataBean datas = list.get(position);
textView.setText(datas.getNews_title());
// 请求图片
//请求图片需要在Application中注册
///在你自己的项目中 build.gradle( : 你项目的名字)
// implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
//然后新建一个App的类
String uri = datas.getPic_url();
ImageLoader.getInstance().displayImage(uri, imageView);
//注意 网络权限
return convertView;
}
}
点击button显示Listview
效果图如下:
如果有报错请查看网络