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

 

在许许多多的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](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 使用心得

(明天再续)