您的位置:首页 > 其它

使用PullToRefresh实现下拉刷新和分页加载功能

2016-12-25 18:37 441 查看
PullToRefresh是一套实现非常好的下拉刷新库,它支持:

1.ListView

2.ExpandableListView

3.GridView

4.WebView

等多种常用的需要刷新的View类型,而且使用起来也十分方便。

下面带大家一起用下PullToRefreshListView ,其他几个控件大同小异
PullToRefreshListView 用法和ListView 没有什么区别  listview能用的属性 pulltorefresh也能用,而且在下拉刷新或者分页加载数据的时候,使用PullToRefreshListView 实现下拉刷新或者分页加载配置起来更为简便,特别是对于Android底层不太熟悉的开发者,使用PullToRefreshListView
配置起来更为方便些,因为可以省去你写footView跟headerView相关底层代码的逻辑配置,下面详细说下使用步骤。
1.引入library

如果你是android
studio的话,引入还是比较简单的,在你的gradle中compile 'com.github.userswlwork:pull-to-refresh:1.0.0'2.在xml文件中配置PullToRefreshListView 控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull_to_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
ptr:ptrDrawable="@drawable/default_ptr_flip"
ptr:ptrAnimationStyle="flip"
ptr:ptrHeaderBackground="@android:color/transparent"
ptr:ptrHeaderTextColor="#919191"

/>
</LinearLayout>

关于PullToRefreshListView的一些xml属性大概有如下需要配置的
,我简单说下

         1.ptr是pullToRefresh的配置属性中添加 xmlns:ptr="http://schemas.android.com/apk/res-auto"。

          2.ptr:ptrDrawable="";//这里可以设置自己的上拉下拉图标。

          3.ptr:ptrHeaderBackground="";//上拉时底部的背景色,下拉时头部的背景色

          4.ptr:ptrHeaderTextColor="";//上拉,下拉时Header,Footer显示的字体颜色

          5.ptr:ptrHeaderSubTextColor="";//上拉,下拉Header,Footer中上次刷新时间的颜色

          6.ptr:ptrShowIndicator="";//true时会在控件的右上角和右下角出现设置的icon

          7.ptr:ptrAnimationStyle="";//显示时候图标的取值 ;flip:翻转;rotate:旋转

          8.ptr:ptrRotateDrawableWhilePulling="";//当动画为rotate时,下拉是否旋转

          9.ptr:ptrRefreshableViewBackground="";//设置整个控件布局的背景颜色

          10.ptr:ptrScrollingWhileRefreshingEnabled="";//刷新的时候是否允许ListView或者GridView滚动。推荐使用true

          11.ptr:prtListViewExtrasEnabled="";//决定Header,Footer以何种方式加入PullToRefreshListView.其中为true时,就是以Header的方式加入,在滚动刷新时头部会跟着一起滚动;为false时,就是以Footer的方式加入,在滚动的时候底部会跟着一起滚动。

          12.ptr:ptrMode="";//设置是上拉,下拉还是两者都支持.both:两者都支持;disabled:禁用下拉刷新;pullFromStart:仅支持下拉刷新;pullFromEnd:仅支持上拉刷新;manualOnly:只允许手动触发。(注意:如果不在代码设置它默认的就只有下拉刷新)

以上只是一些基本属性:一般你用的什么控件它都包含原有控件的所有属性,如你使用的是PullToRefreshListView那么它里面同样包含ListView的一些属性。同样上面的属性你都可以在代码中去set***使用。

3.java代码中的配置

/**
* Created by 谢栋 on 2016/12/25.
*/
public class PullToRefresh extends Activity {

private PullToRefreshListView pullToRefresh;
private List<String> mDatas;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pull_to_refresh);

pullToRefresh = (PullToRefreshListView) findViewById(R.id.pull_to_refresh);
mDatas = new ArrayList<>();

LoadDatas(); //装载数据
pullToRefresh.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mDatas));

// //1.实现下拉刷新
// pullToRefresh.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
// @Override
// public void onRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
// new MyAsyncTask().execute(); //模拟装载数据
//
// }
// });

//2.同时实现上拉跟下拉刷新
//2-1设置监听事件
pullToRefresh.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
new MyAsyncTask().execute(); //模拟上拉装载数据
}

@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
new MyAsyncTask().execute(); //模拟下拉装载数据
}
});

//2-2,设置下拉刷新模式BOYH|END|START
pullToRefresh.setMode(PullToRefreshBase.Mode.BOTH); //同时上拉下拉

//设置自定义下拉刷新动画文字 getLoadingLayoutProxy(true, false),参数分别代表要设置上或下的文字修改
ILoadingLayout headerLayout = pullToRefresh.getLoadingLayoutProxy(true, false);
headerLayout.setPullLabel("向下拖动完成刷新...");
headerLayout.setRefreshingLabel("正在加载新数据...");
headerLayout.setReleaseLabel("释放完成刷新...");

//设置底部刷新文字
ILoadingLayout footLayout = pullToRefresh.getLoadingLayoutProxy(false, true);
footLayout.setPullLabel("向上拽动完成刷新...");
footLayout.setRefreshingLabel("正在疯刷新数据...");
footLayout.setReleaseLabel("松开完成刷新...");
footLayout.setLoadingDrawable(getResources().getDrawable(R.drawable.ic_launcher)); //自定义图片
}

private int count = 1; //数据角标索引

/**
* 模拟装载数据
*/
private void LoadDatas() {

for (int i = 0; i < 10; i++) {
mDatas.add(String.format(Locale.CHINA, "下拉列表中的第%d条数据", count));
count++;

}
}

/**
* 异步任务类,下拉或者上拉时模拟请求数据
* pullToRefresh.onRefreshComplete()方法一定要在异步中请求,否则可能无效果
*/
class MyAsyncTask extends AsyncTask<Void, Void, String> {

@Override
protected String doInBackground(Void... params) {

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LoadDatas();
return "success";
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if ("success".equals(s)) {
// 异步调用pullToRefreshListView.onRefreshComplete是会消失的,同步调用头部动画不会消失。
pullToRefresh.onRefreshComplete();

}
}
}
}


最后,有一点需要提的就是onRefreshComplete()方法一定要在异步中调用,否则可能会出现数据已经装载完成,但是头部或者底部的加载数据时出现的动画取消不掉的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: