随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
在前面介绍过XListView的使用,这里介绍一个类似的列表控件:PullToRefreshListView,它来自开源项目PullToRefresh,里面还有一些其他控件,使用非常方便,直接上源码:
MainActivity:
package com.home.testpulltorefresh;
import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.text.format.DateUtils;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.home.testpulltorefreshlistview.R;
public class MainActivity extends Activity {
// 列表控件
private PullToRefreshListView mListView;
// 数据集合
private ArrayList<String> items = new ArrayList<String>();
private int start = 0;
// 适配器
private ArrayAdapter<String> adapter;
private static int refreshCnt = 0;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
setAdatapter();
mListView.onRefreshComplete();
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
geneItems();
}
/**
* 设置适配器
*/
private void setAdatapter() {
if (adapter == null) {
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, items);
mListView.setAdapter(adapter);
} else {
adapter.notifyDataSetChanged();
}
}
/**
* 初始化页面控件
*/
private void initView() {
mListView = (PullToRefreshListView) findViewById(R.id.main_lv);
// 设置模式
mListView.setMode(Mode.BOTH);// 同时支持上拉下拉
// mListView.setMode(Mode.PULL_FROM_END);// 只支持上拉Pulling Up
// mListView.setMode(Mode.PULL_FROM_START);// 只支持下拉Pulling Down
// 上拉下拉监听器设置
/*
* 如果Mode设置成Mode.BOTH,监听器需设置为OnRefreshListener2,并实现其onPullDownToRefresh、
* onPullUpToRefresh两个方法
* 如果Mode设置为Mode.PULL_FROM_END或者Mode.PULL_FROM_START
* ,监听器可以设置为OnRefreshListener,并实现其onRefresh方法
* 监听器也可以设置OnRefreshListener2,
* Mode.PULL_FROM_START时触发onPullDownToRefresh;
* Mode.PULL_FROM_END触发onPullUpToRefresh
*/
// 设置OnRefreshListener2监听器情况
mListView.setOnRefreshListener(new OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(
PullToRefreshBase<ListView> refreshView) {
setUpdateTime(refreshView);
refreshItems();
}
@Override
public void onPullUpToRefresh(
PullToRefreshBase<ListView> refreshView) {
setUpdateTime(refreshView);
geneItems();
}
});
// 设置OnRefreshListener监听器情况
// mListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
//
// @Override
// public void onRefresh(PullToRefreshBase<ListView> refreshView) {
// setUpdateTime(refreshView);
// // 如果Mode设置为Mode.PULL_FROM_END,这里执行加载更多业务逻辑
// // 如果Mode设置为Mode.PULL_FROM_START,这里执行刷新业务逻辑
// // geneItems();
// refreshItems();
// }
//
// });
initListViewTipText();
}
/**
* 初始化列表刷新时的提示文本
*/
private void initListViewTipText() {
// 设置上拉刷新文本
ILoadingLayout startLabels = mListView.getLoadingLayoutProxy(true,
false);
startLabels.setPullLabel("下拉刷新...");
startLabels.setReleaseLabel("放开立即刷新...");
startLabels.setRefreshingLabel("正在刷新...");
// 设置下拉刷新文本
ILoadingLayout endLabels = mListView.getLoadingLayoutProxy(false, true);
endLabels.setPullLabel("上拉加载更多...");
endLabels.setReleaseLabel("放开加载更多...");
endLabels.setRefreshingLabel("正在加载...");
}
/**
* 设置更新时间
*
* @param refreshView
*/
private void setUpdateTime(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);
}
/**
* 请求数据
*/
private void geneItems() {
for (int i = 0; i != 5; ++i) {
items.add("refresh cnt " + (++start));
}
handler.sendEmptyMessageDelayed(1, 2000);
}
/**
* 刷新数据
*/
private void refreshItems() {
start = ++refreshCnt;
items.clear();
for (int i = 0; i != 5; ++i) {
items.add("refresh cnt " + (++start));
}
handler.sendEmptyMessageDelayed(1, 2000);
}
}
PullToRefreshListView还有一些其他功能和监听器,这里就不一一介绍了。
main.xml:
<?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"
android:orientation="vertical" >
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/main_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#00000000"
android:fadingEdge="none"
android:fastScrollEnabled="false"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false"
android:smoothScrollbar="true" />
</LinearLayout>
源码下载:http://download.csdn.net/detail/u010142437/8817137