自定义你想要的PullToRefresh

来源:互联网 发布:sql union 之后去重 编辑:程序博客网 时间:2024/04/28 09:21

转载请注明:http://blog.csdn.net/github_34008557/article/details/74558082#reply

现在第三方下拉刷新的库非常多,但是比较常用的就是PullToRefresh了,因为支持的控件比较多 但是缺点就是代码量很大 原生可定制性比较差,所以花了一些时间研究了下这个库。

话不多说,说干就干。我们先集成PullToRefresh到自己的项目中。集成后项目的结构

集成完库,开始写一个简单的ListView看一下默认的效果。

1、PullToRefreshListView快速创建,看效果

MainActivity布局文件

控件初始化和加载适配器


模拟联网,两秒后设置加载完成


Adapter就是基础listView写法就不贴代码了和item自己随便写个简单的布局就好,接下来就可以看效果了。



看到这个上拉和下拉的效果,估计好多小伙伴的需求并不是要这个效果,都会要加一些自己的文字或者动画。下面我们就开始简单的定制这个上拉和下拉的布局

2、文字定制

修改文字比较简单,控件已经提供了相应的方法,直接上代码


紧紧文字的修改是远远不够的,我还要修改动画怎么办呢?下面就是引入动画

3、动画定制

接下来的定制都是需要去库里面修改代码了,可要打起精神,防止出错。

在PullTorefreshBase这个类中扎到 方法;修改以下

//此处实现了我们需要  修改的动画方法:        //修改代码实现  自己的下载刷新动画        LoadingLayout createLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) {            switch (this) {                case ROTATE:                default:                    //帧动画   frameAnimationLayout为     自定义动画类                    //通过mode判断是header还是footer                    if (Mode.PULL_FROM_START == mode) {                        return new FrameAnimationLayout(context, mode, scrollDirection, attrs);                    } else if (Mode.PULL_FROM_END == mode) {                        return new RotateLoadingLayout(context, mode, scrollDirection, attrs);                    }//                        return new RotateLoadingLayout(context, mode, scrollDirection, attrs);                case FLIP:                    return new FlipLoadingLayout(context, mode, scrollDirection, attrs);            }        }
重点就在通过mode参数判断是下拉还是上拉,我可以分别修改动画。但是我还想在控件中加入一些其他文字,这就需要修改Header布局文件,进入资源文件找到,问项目中用的是ListView,所以要修改vertical这个布局,具体修改就看你公司需求自己定制了。
这里要说的是重点!因为这个布局文件header和footer共用的,如果有控件要在代码中操作它的显示与隐藏,要在LoadingLayout类的构造器中初始化对象。

在下面几行代码中,还是通过mode这个参数判断是上拉还是下拉,来区分你的操作,来显示不同的头和脚。


接下来修复添加自己的控件后会有显示方面的bug,

需要在showInvisibleViews和hideAllViews两个方法中分别把需要操作的控件分别显示和隐藏,要不下拉或者上拉距离过
大会导致控件偶尔不隐藏的bug。
4、解决细节问题:下拉后,正在刷新时上拉,此时上拉布局不能显示
所以要解决的就是上拉刷新时,不能下拉刷新;反之亦然。解决办法很简单,下面直接上代码
lv_refresh.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {    @Override    public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {        MyAsyncTask myAsyncTask = new MyAsyncTask();        myAsyncTask.execute();        refreshAdapter.notifyDataSetChanged();        if (lv_refresh.isRefreshing()) {//正在下拉刷新,设置只可以下拉,不能上拉            lv_refresh.setMode(PullToRefreshBase.Mode.PULL_FROM_START);        }    }    @Override    public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {        MyAsyncTask myAsyncTask = new MyAsyncTask();        myAsyncTask.execute();        if (lv_refresh.isRefreshing()) {//正在上拉刷新,设置只可以上拉,不能下拉            lv_refresh.setMode(PullToRefreshBase.Mode.PULL_FROM_END);        }    }});
好啦,就写到这里了,这也是我工作之余花了点时间研究出的一点东西,分享给大家,共同进步~
源码地址