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

来源:互联网 发布:梅宏 大数据系统软件 编辑:程序博客网 时间:2024/05/29 04:33


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 控件

<?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"    xmlns:ptr="http://schemas.android.com/apk/res-auto"    android:orientation="vertical"><com.handmark.pulltorefresh.library.PullToRefreshListView    android:id="@+id/pull_to_refresh"    android:layout_width="match_parent"    android:layout_height="match_parent"    ptr:ptrDrawable="@drawable/default_ptr_flip"    ptr:ptrAnimationStyle="flip"    ptr:ptrHeaderBackground="@android:color/transparent"    ptr:ptrHeaderTextColor="#919191"    /></LinearLayout>


关于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<String> 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<String>(this, android.R.layout.simple_list_item_1, mDatas));//        //1.实现下拉刷新//        pullToRefresh.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {//            @Override//            public void onRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {//                new MyAsyncTask().execute();   //模拟装载数据////            }//        });        //2.同时实现上拉跟下拉刷新        //2-1设置监听事件        pullToRefresh.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {            @Override            public void onPullDownToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {                new MyAsyncTask().execute();   //模拟上拉装载数据            }            @Override            public void onPullUpToRefresh(PullToRefreshBase<ListView> 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<Void, Void, String> {        @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()方法一定要在异步中调用,否则可能会出现数据已经装载完成,但是头部或者底部的加载数据时出现的动画取消不掉的问题。



0 0