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

Android--Demo_PullToRefresh(进阶篇)

2016-06-14 18:42 405 查看
转载请标明出处:http://write.blog.csdn.net/postedit/51673885

Demo_PullToRefresh(基础篇)

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.csdn.net/detail/skyunicorn/9549792
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PullTorefresh