您的位置:首页 > 移动开发 > Android开发

Android下拉刷新框架PullToRefresh使用小结

2014-09-30 10:54 197 查看
近期项目中需要用到下拉刷新和上拉加载更多,之前自己写过仿QQ聊天记录的原生实现下拉刷新,在listview上添加headView来实现,但没时间优化效果差了点,所以采用网上比较流行的下拉刷新框架PullToRefresh。

想必这个框架网上已经有过很多详细的使用介绍,我只是就我在使用过程中遇到的问题进行一番小结,由于这个框架是一个挂载在github上的开源项目,所以顺便介绍一下如何将github上的项目引入到Eclipse中这么一个完整的过程,希望能对读到的朋友有所帮助。

PullToRefresh是作者chrisbanes在2013年发布的一款可以实现下拉刷新和上拉刷新的框架,整体来说比较美观,并且支持listview和gridview等多种控件以及fragment,能应付大多数此类需求了。
首先我们需要到https://github.com/chrisbanes/Android-PullToRefresh去下载PullToRefresh,如果没有Git那么可以直接下载zip包,如图:



下载以后解压得到Android-PullToRefresh-master名字的文件夹,其中包含sample、library、extras三个文件夹,分别是例子,库和针对viewpager、fragment的例子。其实只要library就可以了,为了演示下面将完整的项目导入Eclipse

中。





因为我的已经存在了,所以都是灰色的,全选finish即可导入到Eclipse中,如图:



导入工作完成,现在我们可以运行LauncherActivity的项目,就可以看到作者写的例子了,此处略过。

现在我们来建一个自己的项目来完成一个简单的刷新demo。首先建一个Android工程,这个工程需要用到library库因此需要包含library,默认导入的library是包类型的,如果没有那么做以下处理:



然后在我们建的新项目里面进行包含这个library:



好了,下面我们开始写代码了!

在布局文件里需要引入框架定义的控件:

<?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/lv_pull"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
在activity里找到这个view进行内容设置,代码很简单:

package com.example.testpull;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
/**
* 上拉下拉刷新
* @author donz
* @time 2014年9月30日 下午12:58:56
*/
public class MainActivity extends Activity {
//	可刷新视图
private PullToRefreshListView  lv_pull;
//	模拟数据列表
private List<String> list;
//	数据适配器
private ListAdapter listAdapter;
//	刷新中标识
private boolean isRefreshing;
//	实际数据视图
private ListView lv_actually;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
list.add("8");
list.add("9");
list.add("0");
lv_pull = (PullToRefreshListView) findViewById(R.id.lv_pull);
listAdapter = new ListAdapter();
//		获取可刷新视图的listview方便操作
lv_actually = lv_pull.getRefreshableView();
//		为listview设置数据
lv_actually.setAdapter(listAdapter);
//		BOTH:可上拉和下拉;PULL_FROM_END:只可上拉;PULL_FROM_START:只可下拉。
lv_pull.setMode(Mode.BOTH);
//		设置分割线
lv_pull.getRefreshableView().setDivider(null);
//		设置选中元素背景色
lv_pull.getRefreshableView().setSelector(android.R.color.transparent);
//		getLoadingLayoutProxy(boolean1,boolean2),其中boolean1代表view的头位置,boolean2代表尾位置
//		这里的意思是上拉的时候尾位置的提示语设置
lv_pull.getLoadingLayoutProxy(false, true).setPullLabel("上拉啦啦啦啦刷新");
//		下拉的时候提示语设置
lv_pull.getLoadingLayoutProxy(true, false).setPullLabel("下啦啦啦啦刷新");
//		正在刷新的时候提示语设置
lv_pull.getLoadingLayoutProxy(true, true).setRefreshingLabel("loading......");
//		释放刷新提示语
lv_pull.getLoadingLayoutProxy(true, true).setReleaseLabel("释放我,刷新!");
//		刷新小图标
lv_pull.getLoadingLayoutProxy(true, true).setLoadingDrawable(getResources().getDrawable(R.drawable.ic_launcher));
//		注册刷新监听器,在上拉下拉的时候执行onRefresh方法
lv_pull.setOnRefreshListener(new OnRefreshListener<ListView>(){
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
if (!isRefreshing) {
isRefreshing = true;
if (lv_pull.isHeaderShown()) {  //下拉刷新
refreshData();
} else if (lv_pull.isFooterShown()) {  //上拉加载
refreshData();
}
} else {
//			    	标记当前刷新完成,重置刷新UI,隐藏“刷新中”的效果view。
//			    	Mark the current Refresh as complete. Will Reset the UI and hide the Refreshing View
lv_pull.onRefreshComplete();
}
}
});
}

/**
* 模拟刷新
*/
public void refreshData(){
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPostExecute(Void result) {
isRefreshing = false;
lv_pull.onRefreshComplete();
}
@Override
protected void onPreExecute() {
isRefreshing = true;
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}.execute();
}

private class ListAdapter extends BaseAdapter{
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(getApplicationContext(), R.layout.item, null);
TextView tv_item_title = (TextView) view.findViewById(R.id.tv_item_title);
TextView tv_item_date = (TextView) view.findViewById(R.id.tv_item_date);

tv_item_date.setText(new Date().toLocaleString());
tv_item_title.setText(list.get(position));
return view;
}
}
}
代码都被我加了很详细的注释,相信应该很好读,逻辑也很简单,就是模拟异步任务进行刷新。需要注意的是原框架中没有明确的方法进行判断可刷新视图到底是开始还是结尾,这里通过借鉴网上的方法,由于框架式开源的我们可以直接修改程序的源码,在PullToRefreshListView类里加上两个方法:

<span style="white-space:pre">	</span>public boolean isHeaderShown() {
return getHeaderLayout().isShown();
}

public boolean isFooterShown() {
return getFooterLayout().isShown();
}
这样就可以方便的对可刷新视图进行头和尾巴的判断了!

完工!这只是一个简单的demo,要实现复杂的定制功能还需要对源码进行深入的了解,后续会在写一些东西上来,文中有不恰当之处还请大家多多指正。

附上demo源码:源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: