使用PullToRefresh实现下拉刷新和分页加载功能


PullToRefresh是一套实现非常好的下拉刷新库,它支持:

1.ListView

2.ExpandableListView

3.GridView

4.WebView

等多种常用的需要刷新的View类型,而且使用起来也十分方便。

下面带大家一起用下PullToRefreshListView ,其他几个控件大同小异

PullToRefreshListView 用法和ListView 没有什么区别  listview能用的属性 pulltorefresh也能用,而且在下拉刷新或者分页加载数据的时候,使用 PullToRefreshListView 实现下拉刷新或者分页加载配置起来更为简便,特别是对于Android底层不太熟悉的开发者,使用PullToRefreshListView 配置起来更为方便些,因为可以省去你写footView跟headerView相关底层代码的逻辑配置,下面详细说下使用步骤。

1.引入library

如果你是android studio的话,引入还是比较简单的,在你的gradle中

compile 'com.github.userswlwork:pull-to-refresh:1.0.0'
2.在xml文件中配置 PullToRefreshListView 控件






关于PullToRefreshListView的一些xml属性大概有如下需要配置的 ,我简单说下

         1.ptr是pullToRefresh的配置属性中添加 xmlns:ptr="http://schemas.android.com/apk/res-auto"。

          2.ptr:ptrDrawable="";//这里可以设置自己的上拉下拉图标。

          3.ptr:ptrHeaderBackground="";//上拉时底部的背景色,下拉时头部的背景色

          4.ptr:ptrHeaderTextColor="";//上拉,下拉时Header,Footer显示的字体颜色

          5.ptr:ptrHeaderSubTextColor="";//上拉,下拉Header,Footer中上次刷新时间的颜色

          6.ptr:ptrShowIndicator="";//true时会在控件的右上角和右下角出现设置的icon

          7.ptr:ptrAnimationStyle="";//显示时候图标的取值 ;flip:翻转;rotate:旋转

          8.ptr:ptrRotateDrawableWhilePulling="";//当动画为rotate时,下拉是否旋转

          9.ptr:ptrRefreshableViewBackground="";//设置整个控件布局的背景颜色

          10.ptr:ptrScrollingWhileRefreshingEnabled="";//刷新的时候是否允许ListView或者GridView滚动。推荐使用true

          11.ptr:prtListViewExtrasEnabled="";//决定Header,Footer以何种方式加入PullToRefreshListView.其中为true时,就是以Header的方式加入,在滚动刷新时头部会跟着一起滚动;为false时,就是以Footer的方式加入,在滚动的时候底部会跟着一起滚动。

          12.ptr:ptrMode="";//设置是上拉,下拉还是两者都支持.both:两者都支持;disabled:禁用下拉刷新;pullFromStart:仅支持下拉刷新;pullFromEnd:仅支持上拉刷新;manualOnly:只允许手动触发。(注意:如果不在代码设置它默认的就只有下拉刷新)

以上只是一些基本属性:一般你用的什么控件它都包含原有控件的所有属性,如你使用的是PullToRefreshListView那么它里面同样包含ListView的一些属性。同样上面的属性你都可以在代码中去set***使用。


3.java代码中的配置



/**
 * Created by 谢栋 on 2016/12/25.
 */
public class PullToRefresh extends Activity {

    private PullToRefreshListView pullToRefresh;
    private List mDatas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pull_to_refresh);

        pullToRefresh = (PullToRefreshListView) findViewById(R.id.pull_to_refresh);
        mDatas = new ArrayList<>();


        LoadDatas();  //装载数据
        pullToRefresh.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, mDatas));



//        //1.实现下拉刷新
//        pullToRefresh.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener() {
//            @Override
//            public void onRefresh(PullToRefreshBase pullToRefreshBase) {
//                new MyAsyncTask().execute();   //模拟装载数据
//
//            }
//        });

        //2.同时实现上拉跟下拉刷新
        //2-1设置监听事件
        pullToRefresh.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase pullToRefreshBase) {
                new MyAsyncTask().execute();   //模拟上拉装载数据
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase pullToRefreshBase) {
                new MyAsyncTask().execute();   //模拟下拉装载数据
            }
        });

        //2-2,设置下拉刷新模式BOYH|END|START
        pullToRefresh.setMode(PullToRefreshBase.Mode.BOTH);  //同时上拉下拉

        //设置自定义下拉刷新动画文字  getLoadingLayoutProxy(true, false),参数分别代表要设置上或下的文字修改
        ILoadingLayout headerLayout = pullToRefresh.getLoadingLayoutProxy(true, false);
        headerLayout.setPullLabel("向下拖动完成刷新...");
        headerLayout.setRefreshingLabel("正在加载新数据...");
        headerLayout.setReleaseLabel("释放完成刷新...");

        //设置底部刷新文字
        ILoadingLayout footLayout = pullToRefresh.getLoadingLayoutProxy(false, true);
        footLayout.setPullLabel("向上拽动完成刷新...");
        footLayout.setRefreshingLabel("正在疯刷新数据...");
        footLayout.setReleaseLabel("松开完成刷新...");
        footLayout.setLoadingDrawable(getResources().getDrawable(R.drawable.ic_launcher));  //自定义图片
    }


    private int count = 1;   //数据角标索引

    /**
     * 模拟装载数据
     */
    private void LoadDatas() {

        for (int i = 0; i < 10; i++) {
            mDatas.add(String.format(Locale.CHINA, "下拉列表中的第%d条数据", count));
            count++;

        }
    }


    /**
     * 异步任务类,下拉或者上拉时模拟请求数据
     * pullToRefresh.onRefreshComplete()方法一定要在异步中请求,否则可能无效果
     */
    class MyAsyncTask extends AsyncTask {

        @Override
        protected String doInBackground(Void... params) {

            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            LoadDatas();
            return "success";
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            if ("success".equals(s)) {
//                异步调用pullToRefreshListView.onRefreshComplete是会消失的,同步调用头部动画不会消失。
                pullToRefresh.onRefreshComplete();

            }
        }
    }
}

最后,有一点需要提的就是onRefreshComplete()方法一定要在异步中调用,否则可能会出现数据已经装载完成,但是头部或者底部的加载数据时出现的动画取消不掉的问题。


你可能感兴趣的:(Android)