前言
搞不定这个nb的框架实在是如鲠在喉。请沉下心读完,我保你能实现用。
能开始写这一篇文章实在是“山穷水复疑无路,柳暗花明又一村”。
参考了好多前辈的文章,心力憔悴的难受。首先感谢他们能教会我使用这个框架,其次是,网上博客很多,质量参差不齐,对于我这种初学者,难度很大———主要是因为我水平不够,github上的原码也搞不懂,只能寄希望于网络帖子。
话不多说了,开搞。
一、引入jar包
由于这个jar支持下拉刷新和上拉加载两种功能,也可以设置单独一种。所以那个只支持下拉刷新的就不说了。原理一样。
compile 'in.srain.cube:ptr-load-more:1.0.6'
二、xml布局
<?xml version="1.0" encoding="utf-8"?>
<in.srain.cube.views.ptr.PtrFrameLayout
android:id="@+id/ptr_frame_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
cube_ptr:ptr_resistance_header="1.7"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_duration_to_back_header="300"
cube_ptr:ptr_duration_to_close_header="2000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_resistance_footer="1.3"
cube_ptr:ptr_duration_to_back_footer="300"
cube_ptr:ptr_duration_to_close_footer="2000">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
android:gravity="center"
android:text="textView"/>
</LinearLayout>
</in.srain.cube.views.ptr.PtrFrameLayout>
in.srain.cube.views.ptr.PtrFrameLayout可以包含任意控件、布局
解析xml内的参数:
参数 | 释义 |
---|---|
ptr_resistance_header | header阻尼系数。默认: 1.7f,越大,感觉下拉刷新时越吃力 |
ptr_resistance_footer | footer阻尼系数。默认: 1.7f,越大,感觉上拉加载时越吃力 |
ptr_ratio_of_header_height_to_refresh | 触发刷新时移动的位置比例。默认,1.2f,移动达到头部高度1.2倍时可触发刷新操作。下拉刷新,上拉加载都一样 |
ptr_duration_to_back_header | 过度向下拉扯刷新高度,回弹到刷新正常高度时间,默认200ms |
ptr_duration_to_back_footer | 过度向上拉扯加载高度,回弹到加载正常高度时间 |
ptr_duration_to_close_header | 刷新完成后,关闭header时间 |
ptr_duration_to_close_footer | 加载完成后,关闭footer时间 |
ptr_keep_header_when_refresh | 刷新是保持头部,也就是显示头部。默认值 true。false:隐藏头部 |
ptr_pull_to_fresh | 下拉刷新 / 释放刷新。 默认为释放的时候刷新 |
可以在xml内设置,也可以在java代码中设置:
final PtrFrameLayout ptrFrameLayout = findViewById(R.id.ptr_frame_layout);
//配置头部参数,可以在xml中设置
// the following are default settings
ptrFrameLayout.setResistance(1.7f);
ptrFrameLayout.setRatioOfHeaderHeightToRefresh(1.2f);
ptrFrameLayout.setDurationToClose(200);
ptrFrameLayout.setDurationToCloseHeader(1000);
// default is false
ptrFrameLayout.setPullToRefresh(false);
// default is true
ptrFrameLayout.setKeepHeaderWhenRefresh(true);
这里也不全,可以类推补充。
三、Activity编写
public class MainActivity extends AppCompatActivity {
private PtrFrameLayout ptrFrameLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
ptrFrameLayout = (PtrFrameLayout) findViewById(R.id.ptr_frame_layout);
//第一种头部,StoreHouse风格的头部实现
/*StoreHouseHeader storeHouseHeader = new StoreHouseHeader(this);
storeHouseHeader.setPadding(0,100,0,0);
storeHouseHeader.setBackgroundColor(Color.BLACK);
storeHouseHeader.setTextColor(Color.WHITE);
storeHouseHeader.initWithString("adidasi");//只可英文,中文不可运行(添加时间)
ptrFrameLayout.setHeaderView(storeHouseHeader);
ptrFrameLayout.addPtrUIHandler(storeHouseHeader);*/
//第二种头部,Material Design风格的头部实现,类似SwipeRefreshLayout
/*MaterialHeader materialHeader = new MaterialHeader(this);
materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});
ptrFrameLayout.setHeaderView(materialHeader);
ptrFrameLayout.addPtrUIHandler(materialHeader);*/
//第三种头部,经典 风格的头部实现,下拉箭头+时间,,下拉刷新
//定义下拉刷新样式
PtrClassicDefaultHeader ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);
//添加到顶部
ptrFrameLayout.setHeaderView(ptrClassicDefaultHeader);
//添加到布局中
ptrFrameLayout.addPtrUIHandler(ptrClassicDefaultHeader);
//上拉加载
//定义上拉加载样式
PtrClassicDefaultFooter ptrClassicDefaultFooter = new PtrClassicDefaultFooter(this);
//为加载添加布局样式
ptrFrameLayout.setFooterView(ptrClassicDefaultFooter);
//添加到布局中
ptrFrameLayout.addPtrUIHandler(ptrClassicDefaultFooter);
//监听
ptrFrameLayout.setPtrHandler(new PtrDefaultHandler2() {
//加载更多监听
@Override
public void onLoadMoreBegin(PtrFrameLayout frame) {
ptrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "刷新结束", Toast.LENGTH_SHORT).show();
//完成加载,隐藏布局
ptrFrameLayout.refreshComplete();
}
},1000);
}
//下拉刷新监听
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
ptrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "加载结束", Toast.LENGTH_SHORT).show();
//结束刷新,隐藏布局
ptrFrameLayout.refreshComplete();
}
},1000);
}
});
//设置模式
//BOTH:下拉刷新,下拉加载
//NONE:都不监听
//LOAD_MORE:只有下拉加载
//REFRESH:只有下拉刷新
ptrFrameLayout.setMode(PtrFrameLayout.Mode.BOTH);
}
}
总结
代码内注释很明确了,如果哪里不明白可以留言。
只需要这三步就可以了,也很简单,却让我这个初学的人很蛋疼。
这三种方式对要求不高的勉强可以用,但是经常需要一些自定义动画,这个框架的强大之处就在于这里。下一篇我将搞一个自己定义的简单动画刷新Ultral-pull-to-refresh自定义动画刷新效果(二)。有什么不对的欢迎指出,谢谢