实现XlistView的简洁方法PullToRefreshListView

来源:互联网 发布:u盘做linux启动盘 编辑:程序博客网 时间:2024/06/06 02:56

XListView是一个含有下拉刷新、上拉加载功能的控件。特点是代码量极少(只有3个java文件和2个xml文件即可实现),虽然功能较为单一,但是在项目开发中很实用。并且由于代码量小,可以很轻松的理解下拉刷新和下拉加载的源码机制,并加以自定制。

下拉刷新这个功能我们都比较常见了,下面我要介绍的就是这个功能的实现。下面就是我们比较常见的PullToRefreshListView,是让listView有下拉刷新功能。


首先他的

下载项目包,将library包导入即可,其他的包暂时不用

主视图

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.bwie.myapplication123.MainActivity">
     >


    <com.handmark.pulltorefresh.library.PullToRefreshListView
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:id="@+id/pull_refresh_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#000000"
        android:divider="#19000000"
        android:dividerHeight="4dp"
        android:fadingEdge="none"
        android:fastScrollEnabled="false"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:smoothScrollbar="true"
        ptr:ptrAnimationStyle="rotate"
        ptr:ptrHeaderTextColor="#ffffff"
        ptr:ptrHeaderSubTextColor="#00ffff"
        ptr:ptrHeaderBackground="@null"
        ptr:ptrDrawable="@mipmap/ic_launcher"/>
</RelativeLayout>


 <?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">


    <TextView
        android:text="TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/newsname"
        android:layout_weight="1" />
    <TextView
        android:text="TextView"
        android:layout_marginLeft="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/newstime"
        android:layout_weight="1" />
</LinearLayout>



开始编写代码

1.找到这个控件,并且设置监听器

这里面用到了一个日期的工具类,其实就是设置上次下拉的时间的。此外在下拉后会触发一个异步任务

package com.bwie.myapplication;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import android.widget.Toast;


import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;


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


public class MainActivity extends AppCompatActivity {


    private PullToRefreshListView listView;
    private static final String JSON_URL = "http://www.93.gov.cn/93app/data.do?channelId=2&startNum=";
    private ArrayList<News> newsList;
    private MyBaseAdapter myAdatper;
    private List<News.DataBean> data;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化组件
        initView();
        //初始化加载数据
        initData();
    }


    public void initData(){
        pullToRefreshData();
    }
    //下载刷新,加载数据,显示数据
    public void pullToRefreshData(){
        new AsyncTask<String,Integer,String>(){
            @Override
            protected String doInBackground(String... params) {


                String json = new NetWorkUtil().getJsonByHttpUrlConnection(JSON_URL+"1");


                return json;
            }


            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                //解析json
                Gson gson =new Gson();
                News news = gson.fromJson(s, News.class);
                data = news.getData();


                myAdatper = new MyBaseAdapter(MainActivity.this, data);
                listView.setAdapter(myAdatper);


                listView.onRefreshComplete();//停止刷新
            }
        }.execute();
    }


    int index = 1;
    //下载刷新,加载数据,显示数据
    public void loadMoreData(){
        new AsyncTask<String,Integer,String>(){
            @Override
            protected String doInBackground(String... params) {
                index++;
                String json = new NetWorkUtil().getJsonByHttpUrlConnection(JSON_URL+index);
                return json;
            }


            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                //解析json
             /*   SuperClass superClass = new Gson().fromJson(s, SuperClass.class);
                newsList.addAll(superClass.getData());*/
                Gson gson =new Gson();
                News news = gson.fromJson(s, News.class);
                data.addAll(news.getData());
                myAdatper.notifyDataSetChanged();
            }
        }.execute();
    }


    public void initView(){
        listView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
        listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                //当下拉刷新,进入此方法
                Toast.makeText(MainActivity.this,"下拉刷新",Toast.LENGTH_SHORT).show();
                //加载新数据,刷新显示
                pullToRefreshData();


            }
        });
        listView.setOnLastItemVisibleListener(new PullToRefreshBase.OnLastItemVisibleListener() {
            @Override
            public void onLastItemVisible() {
                Toast.makeText(MainActivity.this,"上拉显示出listview的最后一行",Toast.LENGTH_SHORT).show();
                loadMoreData();
            }
        });
    }
        }


//一个工具类


package com.bwie.myapplication123;


import android.util.Log;


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


/**
 * Created by Administrator on 2017/9/15.
 */


public class NetWorkUtil {
    public String getJsonByHttpUrlConnection(String jsonUrl){
        URL url = null;
        HttpURLConnection httpURLConnection = null;
        String jsonStr = "";
        try {
            url = new URL(jsonUrl);//创建URL对象,连接JSON_URL对应的服务器
            httpURLConnection = (HttpURLConnection) url.openConnection();//打开连接
            httpURLConnection.setConnectTimeout(5000);//设置请求时长为5秒
            httpURLConnection.setReadTimeout(5000);//设置读取服务器响应数据的时长


            int resCode = httpURLConnection.getResponseCode();//得到响应结果码


            if(resCode == 200){//表示响应成功,可以获得相应的额结果
                //得到响应的结果,,服务器响应的输入流
                InputStream inputStream = httpURLConnection.getInputStream();
                byte[] buffers = new byte[1024];
                int length = 0;
                while((length = inputStream.read(buffers)) != -1){//本次循环成立,说明读取到了数据
                    jsonStr += new String(buffers,0,length);
                }
                //循环完毕,读取数据完毕
                Log.d("main",jsonStr);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonStr;
    }
}




在这里Ben我就不传了
接下来还有一个适配器
package com.bwie.myapplication123;


import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


import java.util.List;


 


public class MyBaseAdapter extends BaseAdapter {
    private Context context;
    private List<News.DataBean> newsList;


    public MyBaseAdapter(Context context, List<News.DataBean> newsList) {
        this.context = context;
        this.newsList = newsList;
    }


    @Override
    public int getCount() {
        return newsList.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) {
        ViewHolder viewHolder = null;
        if(convertView == null){
            viewHolder = new ViewHolder();
            convertView = View.inflate(context, R.layout.list_item, null);
            viewHolder.newsName = (TextView) convertView.findViewById(R.id.newsname);
            viewHolder.newsTime = (TextView) convertView.findViewById(R.id.newstime);


            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }


        //配置数据
        News.DataBean dataBean = newsList.get(position);


        viewHolder.newsName.setText(dataBean.getTITLE().substring(0,5));
        viewHolder.newsTime.setText(dataBean.getSHOWTIME());
        return convertView;
    }


    class ViewHolder{
        TextView newsName,newsTime;
    }
}


别忘了加权限<uses-permission android:name="android.permission.INTERNET"/>