在许许多多的android项目中,下拉刷新是必不可少的一个小模块,最近的一个项目中,很多模块都需要实现这么一个功能,最后采用的是Github上很火的开源项目,PullToRefresh,下面,简单说一下PullToRefresh的使用方法和个人的心得。
开源项目地址:https://github.com/johannilsson/android-pulltorefresh
1 使用方法
1.1 导入lib项目,设置项目关联
到开源项目的官网下载整个项目,导入到eclipse中,到你的主项目,右键,项目属性,选择android,在最下面,把刚刚导入进来的pulltorefresh项目add成为一个lib引用。如图:点击放大
1.2 在需要使用下拉刷新的layout中,添加下拉刷新list(或者其他类型),如图:点击放大
附上代码以及解释:
<!-- 带下拉刷新的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](http://www.qiushurong.cn/wp-content/uploads/2014/08/pulltorefresh-3-300x191.jpg)](http://www.qiushurong.cn/wp-content/uploads/2014/08/pulltorefresh-3.jpg) ### 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 使用心得
(明天再续)