下拉刷新的实现方式有很多,本篇主要是使用线程的下拉刷新工具来实现下拉刷新
一、使用PullToRefreshListView实现需要先下载所需要的工程(https://github.com/chrisbanes/Android-PullToRefresh)
下载好之后需要导入项目中的Library工程,添加工程到Eclipse中,然后如图配置
然后,在项目的布局中,这样使用
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull_refresh_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
在布局文件完成之后,就可以编写界面代码了
public class MainActivity extends Activity {
private PullToRefreshListView mListView;
private ArrayList<String> mListItems; //显示的数据
private ArrayAdapter<String> mAdapter; //显示的adapter
private TextView mTextTitle;
private int mCurrentNum = 0;
private Handler mHandle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandle =new Handler(this.getMainLooper());
mListView = (PullToRefreshListView)findViewById(R.id.activity_main_pull_refresh_list);
mTextTitle = (TextView)findViewById(R.id.activity_main_text_title);
mListItems = new ArrayList<String>();
for(int i = mCurrentNum;i < mCurrentNum+10;i++){
mListItems.add(i+"");
}
//新建adapter
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);
//绑定adapter
mListView.setAdapter(mAdapter);
initListener();
}
private void initListener(){
//刷新方法,当设置Mode.BOTH时,使用OnRefreshListener2
//当不用Mode.BOTH双向拉动刷新时,只需要使用
mListView.setOnRefreshListener(new OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
mTextTitle.setText("下拉刷新");
//这里是下拉吗
downpullrefreshData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
mTextTitle.setText("上拉刷新");
Log.i("ceshi", "上啦刷新");
//这里是上啦吗
uppullrefreshData();
}
});
// mListView.setMode(Mode.PULL_FROM_START);
// mListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
//
// @Override
// public void onRefresh(PullToRefreshBase<ListView> refreshView) {
//
// }
// });
//当下拉到显示最后一项时
mListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
@Override
public void onLastItemVisible() {
Log.i("ceshi", "最后一部分可以看到了");
uppullrefreshData();
}
});
//setOnLastItemVisibleListener(OnLastItemVisibleListener listener):设置是否到底部监听器;
/**
* Mode.BOTH:同时支持上拉下拉
* Mode.PULL_FROM_START:只支持下拉Pulling Down
* Mode.PULL_FROM_END:只支持上拉Pulling Up
*/
mListView.setMode(Mode.BOTH);
}
/**
* 下拉刷新数据,这里是刷新,会清空之前的数据
*/
private void downpullrefreshData(){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mListItems.clear();
for(int i = 0;i < 10;i++){
mListItems.add(i+""+",下拉刷新");
}
refreshPullRefreshAdapter();
}
}).start();
}
/**
* 上拉刷新数据,这里是添加
*/
private void uppullrefreshData(){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i = mCurrentNum;i < mCurrentNum+10;i++){
mListItems.add(i+""+",上拉刷新");
}
mCurrentNum +=10;
refreshPullRefreshAdapter();
}
}).start();
}
/**
* 刷新显示
*/
private void refreshPullRefreshAdapter(){
mHandle.post(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
mListView.onRefreshComplete();
}
});
}
}
至此,一个最基本的下拉刷新+上拉加载更多就完成了,在写完之后,针对目前的完成状况
可以预见,目前的缺陷是:
1、还没有完成下拉刷新和上拉刷新时的动画及文字的自定义
2、虽然有了上拉到显示最后一项时,立刻加载下一页的功能,但是如果再进行需求的灵活变通时,就
存在一定的局限性,例如在显示到倒数第五个时就加载下一页,这样在网速没有问题时可以让用户毫无阻力地显示下一页,但是这种实现就目前看来可能比较困难,这需要对PullToRefreshListView的进一步了解才能知道能否实现