一 ,添加权限
<uses-permission android:name="android.permission.INTERNET"/>
二 , 网络判断工具类
public class HttpUtils { //get请求获取网络数据 public static String getData(String utl) { try { URL url = new URL(utl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(1024 * 8); connection.setReadTimeout(1024 * 8); connection.setRequestMethod("GET"); int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = connection.getInputStream(); int len = 0; byte[] buf = new byte[1024 * 8]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((len = inputStream.read(buf)) != -1) { baos.write(buf, 0, len); } baos.close(); return baos.toString(); } else { Log.e("TAG", "onCreate: Error" + responseCode); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }
三 ,图片加载工具类
public class Imageloderutils { public static void setImageView(String url, Context context, ImageView imageView) { //初始化 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).build(); //创建Imageloader 对象 ImageLoader imageLoader = ImageLoader.getInstance(); //设置初始化 imageLoader.init(config); DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.mipmap.ic_launcher) //设置图片在下载期间显示的图片 .showImageForEmptyUri(R.mipmap.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.mipmap.ic_launcher) //设置图片加载/解码过程中错误时候显示的图片 .cacheInMemory(true)//设置下载的图片是否缓存在内存中 .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中 .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型 .build();//构建完成 imageLoader.displayImage(url, imageView, options); } }
四 ,解析字符串的bean类
public class MyBean { public String reason; public ResultBean result; public int error_code; public static class ResultBean { public String stat; public List<DataBean> data; public static class DataBean { public String uniquekey; public String title; public String date; public String category; public String author_name; public String url; public String thumbnail_pic_s; public String thumbnail_pic_s02; public String thumbnail_pic_s03; } } }
五,适配器,用来显示数据
public class MyAdapter extends BaseAdapter { private Context context; private List<MyBean.ResultBean.DataBean> list; public MyAdapter(Context context, List<MyBean.ResultBean.DataBean> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.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 holder; if(view == null){ holder = new ViewHolder(); view = View.inflate(context,R.layout.item,null); holder.iv = view.findViewById(R.id.iv); holder.tv = view.findViewById(R.id.tv); view.setTag(holder); }else{ holder = (ViewHolder) view.getTag(); } //赋值 holder.tv.setText(list.get(i).title); Imageloderutils.setImageView(list.get(i).thumbnail_pic_s,context,holder.iv); return view; } class ViewHolder{ TextView tv; ImageView iv; } }
六,布局MainActivity.xml(我这里使用的是XListView,实现上拉刷新刷新,下拉加载,需要添加依赖库或是依赖包,你可以使用listview显示数据)
<com.bawei.xlistviewlibrary.XListView android:id="@+id/xlistview" android:layout_width="match_parent" android:layout_height="match_parent" />
七,布局每一条数据的显示情况
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示数据" /> <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
八,操作数据,MainActivity中
public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener { private List<MyBean.ResultBean.DataBean> list ; private XListView lv; private MyAdapter myAdapter; private String utl="http://v.juhe.cn/toutiao/index?type=toutiao&key=d4c18a18c3391f90dc971633f6e6f445"; Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { //刷新listView myAdapter.notifyDataSetChanged(); //隐藏头和尾 closeXlistView(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); list = new ArrayList<MyBean.ResultBean.DataBean>(); initView(); new MyAsyncTask().execute(utl); //开启下拉刷新 lv.setPullRefreshEnable(true); //开启加载更多可用 lv.setPullLoadEnable(true); lv.setXListViewListener(this); } //此方法在主线程中调用即可,放到点击事件,或者onCreate方法都可以,参数就是要请求的网址 //自定义的AsyncTask private class MyAsyncTask extends AsyncTask<String, Integer, String> { @Override protected void onPreExecute() { super.onPreExecute(); } //这个方法运行在子线程,我们可以做一个耗时操作 @Override protected String doInBackground(String... strings) { //网络请求的操作,注意用return返回获取到的字符串,加网络权限 String data = HttpUtils.getData(strings[0]); Gson gson = new Gson(); MyBean myBean = gson.fromJson(data,MyBean.class); list.addAll(myBean.result.data) ; return null; } //运行在主线程,这个方法在doInBackground执行之后执行.我们一般做从网络拿到数据,使用的数据的操作 @Override protected void onPostExecute(String s) { //拿到处理后的数据,更新UI myAdapter = new MyAdapter(MainActivity.this,list); lv.setAdapter(myAdapter); super.onPostExecute(s); } } private void initView() { lv = (XListView) findViewById(R.id.xlistview); } @Override public void onRefresh() { handler.postDelayed(new Runnable() { @Override public void run() { list.add(0,list.get(5)); handler.sendEmptyMessage(0); } },2000); } @Override public void onLoadMore() { handler.postDelayed(new Runnable() { @Override public void run() { for(int x=0; x<10; x++){ list.add(list.get(x)); } handler.sendEmptyMessage(0); } },2000); } private void closeXlistView() { //停止加载更多 lv.stopLoadMore(); //停止刷新 lv.stopRefresh(); //更新时间 lv.setRefreshTime("一分钟前"); } }
案例效果图: