一、前言
app中经常会用到下拉刷新的功能,有人通过重写listview实现,当下拉到listview的顶部的时候,显示出加载的view,至于加载的view慢慢显示,可以不同的改变view的padding达到效果,但是这种实现方式有很大的限制,所以PtrFrameLayout你值得拥有。
二、使用
0、在项目gradle文件中引用:
compile 'in.srain.cube:ultra-ptr:1.0.11'
1、布局文件
<?xml version="1.0" encoding="utf-8"?>
<in.srain.cube.views.ptr.PtrFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:ptr_resistance="1.7"
app:ptr_ratio_of_header_height_to_refresh="1.2"
app:ptr_duration_to_close="200"
app:ptr_duration_to_close_header="300"
app:ptr_keep_header_when_refresh="true"
app:ptr_pull_to_fresh="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#33ff0000">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center_vertical"
android:text="hello world"/>
</LinearLayout>
</in.srain.cube.views.ptr.PtrFrameLayout>
其中:
app:ptr_resistance="1.7":设置下拉的阻尼系数,值越大感觉越难下拉
ptr_ratio_of_header_height_to_refresh:设置超过头部的多少时,释放可以执行刷新操作
ptr_duration_to_close:设置下拉回弹的时间
ptr_duration_to_close_header:设置刷新完成,头部回弹时间,注意和前一个进行区别
ptr_keep_header_when_refresh:设置刷新的时候是否保持头部
ptr_pull_to_fresh:设置下拉过程中执行刷新,我们一般设置为false
当然这几个参数的设置也可以通过代码去实现:
// the following are default settings
mPtrFrame.setResistance(1.7f);
mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
mPtrFrame.setDurationToClose(200);
mPtrFrame.setDurationToCloseHeader(1000);
// default is false
mPtrFrame.setPullToRefresh(false);
// default is true
mPtrFrame.setKeepHeaderWhenRefresh(true);
2、java代码设置
在代码中,如果想要下拉刷新功能很简单,只要简单的三步就OK:
1)设置setPtrHandler:主要是为了判断是否可以刷新(考虑到有AbsListView等滑动view的情况)以及设置刷新前的设置:
mPtrFrameLayout.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
/**
*检查是否可以刷新,这里使用默认的PtrHandler进行判断
*/
return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
/**
* 在刷新前需要准备什么工作
*/
Log.i("wrx144", "id = "+ getThreadId());
mTextView.setText("loading...");
new MyAsyncTask().execute();
}
});
2)设置PtrUIHandler,通过addPtrUIHandler为PtrFrameLayout设置PtrUIHandler,此设置主要是控制下拉时UI变化,当然,所引用的第三方库有写好的PtrUIHandler:
PtrClassicDefaultHeader header = new PtrClassicDefaultHeader(this);
mPtrFrameLayout.addPtrUIHandler(header);
PtrClassicDefaultHeader 既是PtrUIHandler也是View
3)设置HeaderView,通过setHeaderView,此第三方库也是包含写好的view的;PtrClassicDefaultHeader 就是其中一个了
通过以上三步,就可以使用这个强大的下拉功能啦!
3、设置下拉过程中,content的内容布局保持不动
public void setPinContent(boolean pinContent)
参考:android-Ultra-Pull-To-Refresh 源码解析