PullToRefresh是一套实现非常好的下拉刷新库,它支持:
1.ListView
2.ExpandableListView
3.GridView
4.WebView
等多种常用的需要刷新的View类型,而且使用起来也十分方便。
(下载地址:https://github.com/chrisbanes/Android-PullToRefresh)
一、导入Library
下载源码后(https://github.com/chrisbanes/Android-PullToRefresh),里面有个Library工程,添加工程到Eclipse中;
另外extras文件夹还有两个工程:PullToRefreshListFragment和PullToRefreshViewPager,由于我们的这个用不到他们的库文件,所以不必导入了;
二、实战
1、新建工程,添加Libray库到工程中
新建工程(try_PullToRefresh)后,右键-》Properties-》Android-》Add 选择上面的Library,然后就是这个样子的
Xml代码
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull_refresh_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000"
android:divider="@null"
android:fadingEdge="none"
android:fastScrollEnabled="false"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false"
android:smoothScrollbar="true" />
<!--
fadingEdge属性,上边和下边有黑色的阴影
android:fadingEdge="none" 设置后没有阴影了
fastScrollEnabled隐藏滚动条
footerDividersEnabled此ListView将不会在页眉视图前画分隔符。此属性缺省值为true
headerDividersEnabled此ListView将不会在页头视图前画分隔符。此属性缺省值为true
moothScrollbar当该属性为真时,你在适配器在显示变高条目时,滚动条的把手会在滚动的 过程中改变大小。
-->
(2)设置Mode
Java代码 收藏代码
PullToRefreshListView mListView = (PullToRefreshListView) findViewById(R.id.list_view);
mListView.setMode(Mode.BOTH);
Mode.BOTH:同时支持上拉下拉
Mode.PULL_FROM_START:只支持下拉Pulling Down
Mode.PULL_FROM_END:只支持上拉Pulling Up
(3)实现Listener
如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、onPullUpToRefresh()两个方法。
如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,同时实现onRefresh()方法。当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法,Mode.PULL_FROM的时候只调用onPullUpToRefresh()方法.
实现list基类
/**
* 下拉刷新的页面
*/
public abstract class BaseListViewActivity extends BaseActivity {
// 总页数,可修改为适合的个数,分页
protected int pageSize = 15;
// 页面由BaseListViewActivity类控制
protected int currentPageNum = 1;
// 最多
protected int max_page = -1;
protected PullToRefreshListView mPullRefreshListView;
protected ListView mMainList;
/**
* 加载更多列表必须调用
*/
protected void initPullRefreshListView() {
mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
// 这里有个需要注意的地方,如果使用的是 ListView 的拉动效果则该布局产生的对象本省并不是 ListView
// ,而是程序内部动态生成了一个 ListView 实例,若要获取真正的 ListView 对象则需要使用一个方法来获取
mMainList = mPullRefreshListView.getRefreshableView();
//透明
mMainList.setSelector(android.R.color.transparent);
//设置监听器
mPullRefreshListView.setOnRefreshListener(new Onrefresh());
//设置刷新
mPullRefreshListView.setRefreshing();
//点击事件
mPullRefreshListView.setOnItemClickListener(this);
// 设置为上下拉刷新模式
mPullRefreshListView.setMode(Mode.BOTH);
initIndicator();
}
/**
* 设置下拉刷新和上拉加载的提示语
*/
private void initIndicator() {
ILoadingLayout startLabels = mPullRefreshListView.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("下拉刷新"); // 刚下拉时,显示的提示
startLabels.setRefreshingLabel("正在刷新..."); // 刷新时
startLabels.setReleaseLabel("松开刷新"); // 下来达到一定距离时,显示的提示
ILoadingLayout endLabels = mPullRefreshListView.getLoadingLayoutProxy(false, true);
endLabels.setPullLabel("上拉加载更多"); // 刚下拉时,显示的提示
endLabels.setRefreshingLabel("正在加载..."); // 刷新时
endLabels.setReleaseLabel("松开加载更多"); // 下来达到一定距离时,显示的提示
}
class Onrefresh implements OnRefreshListener2<ListView> {
// 下拉刷新
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
// 时间显示
String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
setOnRefreshAction();
}
// 上拉刷新
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
setLoadMoreAction();
}
}/**
* 显示加载
*/
protected void showRefreshLoading() {
mPullRefreshListView.setRefreshing();
setOnRefreshAction();
}
/**
* 隐藏加载
*/
protected void hideRefreshLoading() {
mPullRefreshListView.onRefreshComplete();// 将下拉视图收起
}
/**
* 设置刷新事件
*/
protected void setOnRefreshAction() {
currentPageNum = 1;
RefreshAction();
}
/**
* 设置加载更多事件
*/
protected void setLoadMoreAction() {
currentPageNum++;
LoadMoreAction();
}
@Override
public void onHttpResp(String str, int code, String msg, int id) {
super.onHttpResp(str, code, msg, id);
if (mPullRefreshListView != null) {
mPullRefreshListView.onRefreshComplete(); // 将下拉视图收起
}
}
/**
* 设置上拉刷新事件
*/
protected abstract void RefreshAction();
/**
* 设置下拉加载更多事件
*/
protected abstract void LoadMoreAction();
/**
* 控制mPullRefreshListView的状态,一般在获取网络数据后调用
*/
protected void setListViewStatus(SimpleBaseAdapter adapter, List<?> list) {
if (currentPageNum == 1)
adapter.clear();
// 走到这里应该是出错了,不然不应该返回null
if (list == null) {
mPullRefreshListView.setMode(Mode.BOTH);
return;
}
// 如果返回的数据小于一页最多显示的数据,认为数据已经加载完了
if (list.size() < pageSize && list.size() > 0) {
if (mPullRefreshListView != null) {
mPullRefreshListView.setMode(Mode.PULL_FROM_START);
}
} else {
if (mPullRefreshListView != null) {
mPullRefreshListView.setMode(Mode.BOTH);
}
}
// 如果返回的数据为0,也认为数据已经加载完了
if (list.size() == 0) {
mPullRefreshListView.setMode(Mode.PULL_FROM_START);
showToast("没有数据..");
return;
}
adapter.appendToList(list);
}
/**
* 当listview为空时显示
*/
protected void setEmptyView(String emptyText) {
TextView emptyTv = new TextView(this);
emptyTv.setGravity(Gravity.CENTER);
emptyTv.setTextColor(getResources().getColor(R.color.grey_d2));
emptyTv.setTextSize(18);
emptyTv.setText(emptyText);
mPullRefreshListView.setEmptyView(emptyTv);
}
}