Android-开源项目-下拉刷新PullToRefresh使用心得

qsuron 发布于 2014-08-27 Android开发 35 次阅读 5 条评论 1373 字 预计阅读时间: 6 分钟


 

在许许多多的android项目中,下拉刷新是必不可少的一个小模块,最近的一个项目中,很多模块都需要实现这么一个功能,最后采用的是Github上很火的开源项目,PullToRefresh,下面,简单说一下PullToRefresh的使用方法和个人的心得。

开源项目地址:https://github.com/johannilsson/android-pulltorefresh

1 使用方法

1.1 导入lib项目,设置项目关联

到开源项目的官网下载整个项目,导入到eclipse中,到你的主项目,右键,项目属性,选择android,在最下面,把刚刚导入进来的pulltorefresh项目add成为一个lib引用。如图:点击放大

pulltorefresh-1

1.2 在需要使用下拉刷新的layout中,添加下拉刷新list(或者其他类型),如图:点击放大

pulltorefresh-2

附上代码以及解释:

   <!-- 带下拉刷新的ListView -->
   <com.handmark.pulltorefresh.library.PullToRefreshListView
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:id="@+id/pull_refresh_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000"
        android:divider="#19000000"
        android:dividerHeight="4dp"
        android:fadingEdge="none"
        android:fastScrollEnabled="false"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:smoothScrollbar="true"
        ptr:ptrAnimationStyle="rotate" //下拉时,图标的动画,rotate是旋转
        ptr:ptrHeaderBackground="#FFF8F8F8" //下拉时,滑出的下拉块背景颜色
        ptr:ptrMode="both" //下拉刷新的模式,both是上拉和下拉
	ptr:ptrDrawable="@drawable/loading4"> //下拉时候的图标

1.3 在代码中对下拉刷新进行更详细的配置

首先是获取实例

mPullRefreshListView = (PullToRefreshListView)
	parentView.findViewById(R.id.pull_refresh_list);

 设置音效

		SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(parentActivity);
		soundListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event);
		soundListener.addSoundEvent(State.RESET, R.raw.reset_sound);
		soundListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound);
		mPullRefreshListView.setOnPullEventListener(soundListener);

 设置提示文字

//设置提示信息
ILoadingLayout startLabels = mPullRefreshListView
		.getLoadingLayoutProxy();
startLabels.setPullLabel("向下拉刷新...");// 刚下拉时,显示的提示
startLabels.setRefreshingLabel("松开刷新...");// 刷新时
startLabels.setReleaseLabel("正在加载中...");// 下来达到一定距离时

关于设置提示文字的,有一个地方要说的是, 

mPullRefreshListView.getLoadingLayoutProxy(参数,参数);

这一句,不传参数的话,默认是同时设置 下拉刷新 和 上拉加载更多 的文本。

添加参数:true,false 是设置 下拉刷新 的文本。

添加参数:false,true 是设置 上拉加载更多 的文本。

 例如:

		//设置 下拉刷新 提示信息
		ILoadingLayout startLabels = mPullRefreshListView.getLoadingLayoutProxy(true,false);
		startLabels.setPullLabel("下拉重新刷新...");// 刚下拉时,显示的提示
		startLabels.setRefreshingLabel("不要命刷新中...");// 刷新时
		startLabels.setReleaseLabel("松开重新刷新...");// 下来达到一定距离时
		//设置 加载更多 提示信息
		ILoadingLayout endLabels = mPullRefreshListView.getLoadingLayoutProxy(false,true);
		endLabels.setPullLabel("上拉加载更多...");// 刚下拉时,显示的提示
		endLabels.setRefreshingLabel("不要命加载中...");// 刷新时
		endLabels.setReleaseLabel("松开加载更多...");// 下来达到一定距离时

 效果:

pulltorefresh-3

1.4 添加一个监听器

// 设置刷新监听器
mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
	@Override
	public void onRefresh(PullToRefreshBase<ListView> refreshView) {
		// 设置最近刷新时间为当前时间
		String label = DateUtils.formatDateTime(parentActivity.getApplicationContext(), System.currentTimeMillis(),
				DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
		refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);

		// 在这这个GetDataTask线程里面进行刷新处理
		new GetDataTask().execute();
	}
});

 这样就完成了一个下拉刷新的操作了

但是我们现在并没有添加任何UI,一般来说,都是利用这个下拉刷新listview本身进行条目UI的操作的。

1.5 在PullToRefreshListView中获取我们要的listView

如下:直接获取这个PullToRefreshListView的里面嵌套的listview,来存放我们要显示的内容

ListView actualListView = mPullRefreshListView.getRefreshableView();
//这个actualListView 就是我们真正可以用来放数据的视图view
// 注册视图
registerForContextMenu(actualListView);
//实例化一个list,存放我们的数据
mListItems = new LinkedList<String>();
mListItems.add("初始化数据");
//实例化一个适配器,把数据和UI进行关联
mAdapter = new ArrayAdapter<String>(parentActivity,
	android.R.layout.simple_list_item_1, mListItems);

1.6 区分  下拉刷新 和 上拉加载更多 [重要]

既然有 下拉刷新 和 上拉加载更多,但他们都是同一个被调用的方法,那么怎么区分呢?

方法:修改开源项目,添加对header和footer的判断,通过header和footer的是否显示 来判断是上拉还是下拉

首先,在我们之前导入的项目中,找到PullToRefreshAdapterViewBase这个类

添加这么2个方法

	public boolean isHeaderShown() {
		return getHeaderLayout().isShown();
	}

	public boolean isFooterShown() {
		return getFooterLayout().isShown();
	}

 然后clean一下主项目,让他重建一下lib包,之后在主项目的监听器里面,进行判断

mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
	@Override
	public void onRefresh(PullToRefreshBase<ListView> refreshView) {

		//这2个方法是我修改了 PullToRefresh 项目后添加进去的,原本开源的项目是没有的。

		//判断是 上拉 还是 下拉
		if(mPullRefreshListView.isHeaderShown()){
			String label = DateUtils.formatDateTime(parentActivity.getApplicationContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
			refreshView.getLoadingLayoutProxy(true,false).setLastUpdatedLabel(label);
			// 开始下拉刷新
        			}else if(mPullRefreshListView.isFooterShown()){
			String label = DateUtils.formatDateTime(parentActivity.getApplicationContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
			refreshView.getLoadingLayoutProxy(false,true).setLastUpdatedLabel(label);
			// 开始加载更多
					}
	}
});

 这样子就初步实现了一个区分的功能了

1.7 在list尾端添加监听器

有时候我们需要在用户滑动到list尾端的时候进行一个提示,或者进行数据的加载,那么会用到这个:

// 在list尾端添加一个监听器
		mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
			@Override
			public void onLastItemVisible() {
				Toast.makeText(parentActivity, "到达尾端,上拉可加载更多...", Toast.LENGTH_SHORT).show();
			}
		});

2 使用心得

(明天再续)