Android--Demo_PullToRefresh(进阶篇)






这节我们试着去修改下拉和上拉的样式

首先,我们开下PullTorefresh中的attrs
打开PullTorefresh-->res-->values-->attrs.xml




查看attrs.xml源码

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="PullToRefresh">

        <!-- A drawable to use as the background of the Refreshable View -->
        <!-- 设置整个刷新列表的背景色 -->
        <attr name="ptrRefreshableViewBackground" format="reference|color" />

        <!-- A drawable to use as the background of the Header and Footer Loading Views -->
        <!--  设置下拉Header或者上拉Footer的背景色 -->
        <attr name="ptrHeaderBackground" format="reference|color" />

        <!-- Text Color of the Header and Footer Loading Views -->
        <!-- 用于设置Header与Footer中文本的颜色 -->
        <attr name="ptrHeaderTextColor" format="reference|color" />

        <!-- Text Color of the Header and Footer Loading Views Sub Header -->
        <!-- 用于设置Header与Footer中上次刷新时间的颜色 -->
        <attr name="ptrHeaderSubTextColor" format="reference|color" />

        <!-- Mode of Pull-to-Refresh that should be used -->
        <attr name="ptrMode">
            <flag name="disabled" value="0x0" /><!-- 禁用下拉刷新 -->
            <flag name="pullFromStart" value="0x1" /><!-- 仅支持下拉刷新 -->
            <flag name="pullFromEnd" value="0x2" /><!-- 仅支持上拉刷新 -->
            <flag name="both" value="0x3" /><!-- 上拉刷新和下拉刷新都支持 -->
            <flag name="manualOnly" value="0x4" /><!-- 只允许手动触发 -->

            <!-- These last two are depreacted -->
            <flag name="pullDownFromTop" value="0x1" /><!-- 已过时,被pullFromStart替代 -->
            <flag name="pullUpFromBottom" value="0x2" /><!-- 已过时,被pullFromEnd替代 -->
        </attr>

        <!-- Whether the Indicator overlay(s) should be used -->
        <!-- 如果为true会在mPullRefreshListView中出现icon,右上角和右下角,挺有意思的 -->
        <attr name="ptrShowIndicator" format="reference|boolean" />

        <!-- Drawable to use as Loading Indicator. Changes both Header and Footer. -->
        <!-- 同时改变头部和底部的图标 -->
        <attr name="ptrDrawable" format="reference" />

        <!-- Drawable to use as Loading Indicator in the Header View. Overrides value set in ptrDrawable. -->
        <!-- 头部视图的图标-->
        <attr name="ptrDrawableStart" format="reference" />

        <!-- Drawable to use as Loading Indicator in the Footer View. Overrides value set in ptrDrawable. -->
        <!-- 底部视图的图标 -->
        <attr name="ptrDrawableEnd" format="reference" />

        <!-- Whether Android's built-in Over Scroll should be utilised for Pull-to-Refresh. -->
        <attr name="ptrOverScroll" format="reference|boolean" />

        <!-- Base text color, typeface, size, and style for Header and Footer Loading Views -->
        <!-- 分别设置下拉Header或者上拉Footer中字体的类型颜色等等 -->
        <attr name="ptrHeaderTextAppearance" format="reference" />
        <!-- Base text color, typeface, size, and style for Header and Footer Loading Views Sub Header -->
        <attr name="ptrSubHeaderTextAppearance" format="reference" />

        <!-- Style of Animation should be used displayed when pulling. -->
        <attr name="ptrAnimationStyle">
            <flag name="rotate" value="0x0" /><!-- rotate(旋转动画)-->
            <flag name="flip" value="0x1" /><!-- flip(翻转动画)-->
        </attr>

        <!-- Whether the user can scroll while the View is Refreshing -->
        <!-- 刷新的时候,是否允许ListView或GridView滚动 -->
        <attr name="ptrScrollingWhileRefreshingEnabled" format="reference|boolean" />

        <!--
           Whether PullToRefreshListView has it's extras enabled. This allows the user to be 
           able to scroll while refreshing, and behaves better. It acheives this by adding
           Header and/or Footer Views to the ListView.
        -->
        <!-- 决定了Header,Footer以何种方式加入mPullRefreshListView,true为刷新时Header,Footer会紧跟着列表 -->
        <attr name="ptrListViewExtrasEnabled" format="reference|boolean" />

        <!--
           Whether the Drawable should be continually rotated as you pull. This only
           takes effect when using the 'Rotate' Animation Style.
        -->
        <attr name="ptrRotateDrawableWhilePulling" format="reference|boolean" />

        <!-- BELOW HERE ARE DEPRECEATED. DO NOT USE. -->
        <attr name="ptrAdapterViewBackground" format="reference|color" />
        <attr name="ptrDrawableTop" format="reference" />
        <attr name="ptrDrawableBottom" format="reference" />
    </declare-styleable>

</resources>


我们按照这个attrs来测试
显示测试上面的修改颜色的几个属性
在布局文件中添加

xmlns:ptr="http://schemas.android.com/apk/res-auto"


然后设置

<com.handmark.pulltorefresh.library.PullToRefreshListView
    android:id="@+id/pull_to_refresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ptr:ptrRefreshableViewBackground = "#ff0"
    ptr:ptrHeaderBackground = "#0ff"
    ptr:ptrHeaderTextColor = "#f0f"
    ptr:ptrHeaderSubTextColor = "#f00"
    />


对应的颜色:




为了显示上次刷新时间,我们修改一下上次写的代码,在执行下拉上拉时获取当前时间。


private void initRefresh()
{

    /*
     * Mode.BOTH:同时支持上拉下拉
     * Mode.PULL_FROM_START:只支持下拉Pulling Down
     * Mode.PULL_FROM_END:只支持上拉Pulling Up
     * Mode.DISABLED:禁用下拉刷新和上拉加载
     * Mode.MANUAL_REFRESH_ONLY:只允许手动触发
     */
    /*
     * 如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、onPullUpToRefresh()两个方法。
     * 如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,同时实现onRefresh()方法。
     * 当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法,
     * Mode.PULL_FROM_END的时候只调用onPullUpToRefresh()方法.
     * 我一般用OnRefreshListener2,因为分工比较清楚
     */
    mPullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);

    mPullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>()
    {

        // 下拉刷新
        @Override
        public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView)
        {

            // 获取上次刷新时间
            String str = DateUtils.formatDateTime(ListActivity.this, System.currentTimeMillis(),
                    DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);

            /*
             * getLoadingLayoutProxy(final boolean includeStart, final boolean includeEnd)
             * 用于指定显示的标签,第一个是改变头部,第二个是改变底部
             */
            ILoadingLayout startLoading = mPullToRefreshListView.getLoadingLayoutProxy(
                    true, false);
            startLoading.setPullLabel("下拉刷新");// 刚下拉时显示的提示
            startLoading.setRefreshingLabel("拼命刷新中...");// 刷新时显示的提示
            startLoading.setReleaseLabel("释放即可刷新");// 下拉达到一定距离时显示的提示
            startLoading.setLastUpdatedLabel("最后加载时间:" + str);


            // 设置一秒后停止刷新(本地设置假数据,时间太短,会导致数据更新后,依旧显示刷新中)
            mPullToRefreshListView.postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    // 停止刷新
                    mPullToRefreshListView.onRefreshComplete();
                    // 加载数据
                    initDownLv();
                    // 刷新适配器中的数据
                    myAdapter.notifyDataSetChanged();
                }
            }, 1000);

        }

        // 上拉加载更多
        @Override
        public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView)
        {

            // 获取上次刷新时间
            String str = DateUtils.formatDateTime(ListActivity.this, System.currentTimeMillis(),
                    DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);

            ILoadingLayout endLoading = mPullToRefreshListView.getLoadingLayoutProxy(false,
                    true);
            endLoading.setPullLabel("上拉加载更多");// 刚上拉时显示的提示
            endLoading.setRefreshingLabel("拼命加载中...");// 加载时的提示
            endLoading.setReleaseLabel("释放即可加载");// 上拉达到一定距离时显示的提示
            endLoading.setLastUpdatedLabel("最后加载时间:" + str);

            // 设置一秒后停止刷新(本地设置假数据,时间太短,会导致数据更新后,依旧显示刷新中)
            mPullToRefreshListView.postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    // 停止刷新
                    mPullToRefreshListView.onRefreshComplete();
                    // 加载数据
                    initUpLv();
                    // 刷新适配器中的数据
                    myAdapter.notifyDataSetChanged();
                }
            }, 1000);
        }
    });
}



然后我们看下效果图



至于ptrMode和代码写的一样,我就不再做演示了


再看
ptr:ptrShowIndicator="true"
默认是false这个东西就是右侧的一个箭头(上下都有,本人觉得没什么卵用,不美观)



再看
ptr:ptrDrawable = "@mipmap/ic_launcher"
我这懒得找图片了,就继续委屈我们的机器人君了



剩下的ptrDrawableStart(设置头部图片)和ptrDrawableEnd(设置底部图片)是单独设置不同图片用的


再看
ptr:ptrScrollingWhileRefreshingEnabled = "true"
默认为false,这个属性是设置在刷新的时候,列表可否滑动,不做演示了。



再看
ptr:ptrListViewExtrasEnabled="false"
默认为true,这个属性是决定了Header,Footer以何种方式加入mPullToRefreshListView,true为刷新时Header,Footer会紧跟着列表
怎么理解呢,还是上图吧以上面的图为例,底部刷新的时候,默认的是紧跟着listView,在数据量大的情况下我们看不出有什么不妥,然而数据量小的情况下(如下图做左),我们会发现很不和谐,这时候这个属性就派上用场了。设置为false后(下图右),我们会发现,它永远都在底部了。




再看
ptr:ptrRotateDrawableWhilePulling = "true"
默认为true,这个属性,在我看来是很鸡肋的一个,true的时候在拉动的时候不限制旋转角度,并且给人一种越拉阻力越大的感觉;false的时候在拉动的时候最多旋转180度,没有给人越拉阻力越大的感觉。
还是上图解释吧,还是这个图(下图左,默认为true),再看设置为false的情况(下图右)






只搞懂了这么多,剩下的只能说我没搞懂了= =(另外上面的属性都可以在代码中设置)

补充:(这个Demo中没有,自己补充吧,因为是后来想起来的)
当是下列情况时,属性为
ptr :ptrDrawable= "@null"<!-- 或者是不设置该属性 -->
ptr :ptrAnimationStyle =  "flip"




Demo地址:http://download.youkuaiyun.com/detail/skyunicorn/9549792








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值