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"//分割线高度
- PullToRefresh下拉刷新库使用总结
- PullToRefresh下拉刷新使用详解
- GitHub开源下拉刷新Android-PullToRefresh使用总结
- Android下拉刷新框架PullToRefresh使用小结
- 安卓下拉刷新,pulltorefresh的使用
- Android-PullToRefresh下拉刷新库基本用法
- Android-PullToRefresh下拉刷新库基本用法
- Android-PullToRefresh下拉刷新库基本用法
- android pulltorefresh 下拉刷新
- PullToRefresh 下拉刷新菜单
- PullToRefresh下拉刷新
- PullToRefresh下拉刷新框架
- PullToRefresh的下拉刷新
- Android开发之GitHub开源下拉刷新Android-PullToRefresh使用总结
- Android 更改下拉刷新(使用PulltoRefresh)的下拉动画样式
- PullToRefresh第三方刷新控件使用总结
- pulltorefresh 下拉刷新 上拉加载更多 总结
- 使用PullToRefresh实现下拉刷新和上拉加载
- Intent传值
- 一个ini配置文件解析器
- RxAndroid+Retrofit项目上手
- oracle的数据量和表空间使用分析
- 解决js和android、iso交互的兼容问题
- PullToRefresh下拉刷新库使用总结
- Tracker与Storage配置详解
- python读取excel文件遇到的问题
- 深入剖析PE文件
- C++ P0003 服务点设置
- js switch case
- windows socket编程中 listen()的backlog参数和未完成队列、已完成队列的关系
- Codeforces Round #382 (Div. 2) E. Ostap and Tree
- 双11背后的网络自动化技术