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中;

android view 强制刷新 android 刷新控件_android


另外extras文件夹还有两个工程:PullToRefreshListFragment和PullToRefreshViewPager,由于我们的这个用不到他们的库文件,所以不必导入了;

二、实战

1、新建工程,添加Libray库到工程中

新建工程(try_PullToRefresh)后,右键-》Properties-》Android-》Add  选择上面的Library,然后就是这个样子的


android view 强制刷新 android 刷新控件_数据_02

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);
}
}