使用前准备工作,需要用到第三方开源文件,可以到github下载MaxWin_Xlistview,需要用到的为view包,头尾XML文件,更改Values中strings.xml(可直接复制),xlistview_arrow.png图片复制过来,然后导入自己的包。完成以上工作,需要在清单文件中给予权限
<uses-permission android:name="android.permission.INTERNET"/>。如果遇到R文件丢失,需要在build.gradler中将
compileSdkVersion 26
targetSdkVersion 26
compile 'com.android.support:appcompat-v7:26.+'
改为25
一:创建布局
XlistView必须为全类名引用
二:代码中主要功能为:获取到数据(以请求网络数据为例),设置适配器,设置监听事件
1,创建一个获取数据的方法(之前有详细讲解异步获取网络数据的步骤,本文直接复制不多做详细注释)
private void getDataShuju() { AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { String path = "此处为请求数据的接口"+NUM; try { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //设置 connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); //获取结果码 int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); String json = streamToString(inputStream,"utf-8");//streamToString方法在下return json; } } catch (Exception e) { e.printStackTrace(); } return ""; } //此方法需要手动提示添加 @Override protected void onPostExecute(String json) { Gson gson = new Gson(); MyBean mb = gson.fromJson(json, MyBean.class); list = new ArrayList<>(); //添加 list.addAll(mb.getData()); adapter = new MyAdapter(MainActivity.this,list); list_view.setAdapter(adapter); } }; asyncTask .execute();}//streamToString方法 将解析获得的字节输入流转换成字符串
private String streamToString(InputStream inputStream, String s) { try { InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String string = null; StringBuilder builder = new StringBuilder(); while ((string=bufferedReader.readLine())!=null){ builder.append(string); } bufferedReader.close(); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return null; }2、创建适配器(跟listview用法差不多,也可以继承自定义的适配器BaseAdapter,以下为自己的适配器,参考)public class MyAdapter extends BaseAdapter{ Context context; List<MyBean.DataBean> list; public MyAdapter(Context context, List<MyBean.DataBean> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder; if (view==null){ view = View.inflate(context,R.layout.item_layout,null); holder = new ViewHolder(); holder.item_text = (TextView) view.findViewById(R.id.item_text); view.setTag(holder); }else{ holder = (ViewHolder) view.getTag(); } holder.item_text.setText(list.get(i).getTitle()); return view; } class ViewHolder{ TextView item_text; } }
3、设置点击监听事件setXListViewListener(this);MainActivity实现XListView.IXListViewListener接口 会重写两个方法,一个刷新: onRefresh() 加载:onLoadMore() 此时需要回到create方法之前//自定义从中间显示,方便展示上拉和下拉 int NUM = 2;@Override public void onRefresh() { NUM --; if (NUM >0){ //获取数据,自定此方法与上边第一次请求数据方法有小改动小区别,可添加刷新时间 refreshData(); }else { Toast.makeText(MainActivity.this,"没有最新数据了",Toast.LENGTH_SHORT).show(); list_view.stopRefresh();//停止刷新 } }private void refreshData() { //异步获取 AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { String path = "网络数据接口"; try { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //设置 connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); //获取结果码 int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); String json = streamToString(inputStream,"utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return ""; }@Override protected void onPostExecute(String json) { Gson gson = new Gson(); MyBean mybean = gson.fromJson(json, MyBean.class); //数据要添加到集合的最前边 list.addAll(0,mybean.getNewslist()); //设置适配器 setAdapte(); //停止刷新 list_view.stopRefresh(); //设置本次刷新的时间 Date date = new Date(System.currentTimeMillis()); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm"); String time = simpleDateFormat.format(date); list_view.setRefreshTime(time); } }; asyncTask .execute(); }@Override public void onLoadMore() { NUM ++; //请求网络获取数据 只需再次调用请求数据的方法即可; }
注意:使用之前都要试试接口是否能用,符合不符合自己的使用需求