PullToRefresh下拉刷新库使用总结

来源:互联网 发布:湖州公务员网络学堂 编辑:程序博客网 时间:2024/06/06 04:04

注意:目前这个库作者已经不再维护了!但是还是可以使用
github地址
Android-PullToRefresh下拉刷新库基本用法

PullToRefresh下拉刷新库使用总结

一.刷新动画设置等

1.下拉刷新和上拉刷新使用不同的刷新头
A.没有改源码的情况下:

private void setPullToRefreshLable() {        ILoadingLayout startLoading = lvWeekAssets.getLoadingLayoutProxy(                true, false);        startLoading.setPullLabel("下拉刷新");// 刚下拉时显示的提示        startLoading.setRefreshingLabel("正在刷新中...");// 刷新时显示的提示        startLoading.setReleaseLabel("释放即可刷新");// 下拉达到一定距离时显示的提示        ILoadingLayout endLoading = lvWeekAssets.getLoadingLayoutProxy(false,                true);        endLoading.setPullLabel("上拉加载更多");// 刚上拉时显示的提示        endLoading.setRefreshingLabel("拼命加载中...");// 加载时的提示        endLoading.setReleaseLabel("释放即可加载更多");// 上拉达到一定距离时显示的提示    }

B.更改了源码的情况下:
找到PullToRefreshBase这个类,定位到createLoadingLayout(1326行开始)这个方法:

LoadingLayout createLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) {            switch (this) {                case ROTATE:                default:                    return new OrangeLoadingLayout(context, mode, scrollDirection, attrs);                case FLIP:                    return new FlipLoadingLayout(context, mode, scrollDirection, attrs);            }        }

如果要上拉和下拉出现不一样的动画,那么就这样写:

 LoadingLayout createLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) {            switch (this) {                case ROTATE:                default:                    switch (mode) {                        case PULL_FROM_START:                            return new OrangeLoadingLayout(context, mode, scrollDirection, attrs);                        case PULL_FROM_END:                            return new FlipLoadingLayout(context, mode, scrollDirection, attrs);                    }                case FLIP:                    return new FlipLoadingLayout(context, mode, scrollDirection, attrs);            }        }

这个下拉是自定义的布局,上拉使用的是默认的箭头刷新的动画,也可以换成旋转的RotateLoadingLayout动画.
default就是我们添加的默认加载的刷新的动画效果了.OrangeLoadingLayout就是自定义的布局,继承自LoadingLayout,写法可以参考原生的FlipLoadingLayout或者RotateLoadingLayout.具体可参考:
PullToRrefresh自定义下拉刷新动画
修改PullToRefresh下拉刷新动画
需要注意的是动画文件应该放在drawable文件夹中,而不是anim中.不过这个不好的地方就是,修改了源码之后只能上拉和下拉都是一样的动画,难以修改成不一样的加载布局.

如果底部的下拉动画还要是自定义的,那么步骤和上拉的是一样的,现在讲一种在原箭头基础上加上文字的方法:
A.首先找到LoadingLayout这个文件,在构造函数的地方加上这些代码:

public LoadingLayout(Context context, final Mode mode, final Orientation scrollDirection, TypedArray attrs) {        super(context);        mMode = mode;        mScrollDirection = scrollDirection;        switch (scrollDirection) {            case HORIZONTAL:                LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_horizontal, this);                break;            case VERTICAL:            default:                switch (mode) {                    case PULL_FROM_START:                        LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_vertical, this);                    case PULL_FROM_END:                        LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_vertical2, this);                }                break;        }

新建pull_to_refresh_header_vertical2这个文件的目的是为了显示上拉时候的提示文字,如果不新建一个的话,那么头部也会出现这个文字.这个布局就大家自己写了,这里就不贴出来了.

B.新建一个FlipLoadingLayout的布局,命名为MyFlipLoadingLayout,在这里对上拉时候的图片进行更换,或者对动画进行更换.
更换上拉的图片的方法:
@Override
protected int getDefaultDrawableResId() {
return R.drawable.default_ptr_flip;
}

C.在values-zh包下找到这个文件pull_refresh_strings
将里面的三个值,修改,比如可以修改为:

<?xml version="1.0" encoding="utf-8"?><resources>  <string name="pull_to_refresh_pull_label">上拉可以加载更多</string>  <string name="pull_to_refresh_release_label">松开立即加载更多</string>  <string name="pull_to_refresh_refreshing_label">正在加载更多的数据...</string></resources>

这样,所有的界面只要使用了这个库,就可以一并修改了,不用再每个界面的代码中设置.
2.下拉刷新的时候提示最近的刷新时间
参考:[Android-PullToRefresh下拉刷新,上拉加载的使用详解]
3.如果取下来的数据没有满足我去获取下一页的数据的时候,那么我不能让上拉加载出现,只留下下拉刷新,只有当数据满足的时候我才让上拉加载出现。
参考:Android-PullToRefresh下拉刷新,上拉加载的使用详解
4.完全自定义自己的ListView,不用第三方的Pull库
Android自定义控件——ListView的下拉刷新与上拉加载
5.listview加载头部并且固定上拉,下拉跟随
6.上拉加载没有数据的时候提示文字,且不再上拉访问数据,上拉图标消失
①打开这个文件PullToRefreshBase,找到onRefreshing方法(在700多行左右).在这两句代码之后添加:

if (mMode.showHeaderLoadingLayout()) {            mHeaderLayout.refreshing();        }        if (mMode.showFooterLoadingLayout()) {            mFooterLayout.refreshing();        }
 if (mCurrentMode == Mode.PULL_FROM_START) {            /**             * pulldown refresh to reset             */            if (mRefreshState == COMPLETE) {                setRefreshState(DEFALULT);            }        } else if (mCurrentMode == Mode.PULL_FROM_END) {            /**             * if loading is completed ,so do not call refreshing listener             */            if (mRefreshState == COMPLETE) {                setState(State.RESET);                return;            }        }

②添加一个刷新状态的方法

//提供方法,如果是true则就算加载完成        public void setIsComplete(Boolean isComplete){        if(isComplete){            setRefreshState(RefreshState.COMPLETE);        }else{            setRefreshState(RefreshState.DEFALULT);        }    }
//改变状态的方法    final void setRefreshState(RefreshState state){        mRefreshState = state;        switch (mRefreshState) {        case DEFALULT://默认字符叫做下拉刷新            mFooterLayout.setPullLabel(getContext().getString(R.string.pull_to_up_refresh_pull_label));            break;        case COMPLETE://完成以后更换底部拉出来要展示的文字         mFooterLayout.setPullLabel(getContext().getString(R.string.pull_to_refresh_complete_label));        default:            break;        }    }
public static enum RefreshState{        //默认        DEFALULT,        //加载完成        COMPLETE    }

③更改一下pullEvent方法
在最后的else if判断中,加上一行代码:

//这里加上一个来自底部并且状态是加载完成的状态的判断就搞定啦。                if(mRefreshState == RefreshState.COMPLETE && mCurrentMode == Mode.PULL_FROM_END){                    return;                }                setState(State.RELEASE_TO_REFRESH);

④让没有数据的时候,上拉只显示文字,不显示箭头
A.找到LoadingLayout文件,定位到reset方法,把这行注释掉:
mHeaderImage.setVisibility(View.VISIBLE);
B.并在这个文件中,新建一个方法:

public final void hideHeaderImage(boolean show) {        if (show) {            mHeaderImage.setVisibility(View.GONE);        } else {            mHeaderImage.setVisibility(View.VISIBLE);        }    }

C.在这个文件PullToRefreshBase,点位到这个方法setRefreshState,在case Complete下面添加一行代码:就是引用B的方法.
mFooterLayout.hideHeaderImage(true);
D.找到这个文件MyFlipLoadingLayout(这个是我自己新建的文件,没有的话就用系统的),定位到这个方法
resetImpl,将这行代码注释掉:
mHeaderImage.setVisibility(View.VISIBLE);

2.常见问题

1.listview显示多种布局
android listview多种布局 getViewTypeCount和getItemViewType
2.NotifyDataSetChange和重新设置adapter的区别
设置数据的方式不一样,造成的效果不一样.当上拉的时候出现新的数据的时候,会将数据加到一个原有的List中,这个时候如果直接再New一个adapter并设置给listview的话,他会重新刷一遍UI,导致又回到头部,而使用Notify方法,数据就可以直接加载到底部,界面列表也会停留在底部.
3.Listview嵌套Listview或者GridView的问题
参考这个文章:
4. ListView设置没有头部和底部分割线

android:headerDividersEnabled//头部分割线  android:footerDividersEnabled//底部分割线android:divider="#E5E9Ec"//设置分割线android:dividerHeight="1px"//分割线高度
1 0
原创粉丝点击