前言
最近基于项目需要,使用PtrFrameLayout框架实现了自定义的下拉刷新控件,大体效果类似于京东APP的下拉刷新动态效果。在这里和大家分享一下具体的思路和需要注意的地方,以便帮助有类似开发和学习需求的同学省点时间。如果这篇文章对大家实际开发有所帮助,还望大家多多转发。

由于项目原因,本文不会涉及详细的具体实现,主要是提供思路和关键点。感兴趣的欢迎大家加入学习小组QQ群: 193765960,该群是技术分享和讨论群,还请遵守小组纪律。

版权归作者所有,如有转发,请注明文章出处:https://xiaodanchen.github.io/

PtrFrameLayout开源项目下载地址

实现的目标和效果

1,尽可能的能够包裹各类布局和控件,不要仅仅适用于listview。
2,通过animation-list的xml作为动画的来源,方便替换
3,head部分通过layout xml定义,包括至少三部分:动画部分,刷新状态提示,上次刷新时间提示
(注:控件不支持上拉加载,其实按照逻辑,加载部分应该由子view自己实现比较好)

关键类

  • MyPtrFrameLayout.java:最终控件,在我们的layout xml中用来包裹我们需要下拉刷新的布局。该类主要参照官方的PtrClassicFrameLayout.java实现。
  • MyPtrHeaderView.java:MyPtrFrameLayout的头部,布局由layout_header_view.xml定义。该类主要参照官方的PtrClassicDefaultHeader.java实现。
  • MyPtrAnimationDrawable.java:MyPtrHeaderView的动画部分,动画来源于自定义的res/drawable/xxx_animation.xml

代码精要

MyPtrAnimationDrawable.java

public class MyPtrAnimationDrawable extends Drawable implements Animatable {
public MyPtrAnimationDrawable(Context context, View parent) {
mContext = context;
mParent = parent;
initAnimations();
} ......
@Override
public void start() {
mAnimation.start();
} @Override
public void stop() {
mAnimation.stop();
} private void initAnimations() {
mParent.setBackgroundResource(R.drawable.xxx_animation);
mAnimation = (AnimationDrawable) mParent.getBackground();
} ......
}

MyPtrHeaderView.java

public class MyPtrHeaderView extends FrameLayout implements PtrUIHandler {
......
protected void initViews() {
View header = LayoutInflater.from(getContext()).inflate(R.layout.layout_header_view, this); mAnimaView = header.findViewById(R.id.xxx);
mDrawable = new MyPtrAnimationDrawable(mContext, mAnimaView);
mDrawable.start();
mRefreshTextView = (TextView) header.findViewById(R.id.yyy);
mLastUpdateTextView = (TextView) header.findViewById(R.id.zzz);
} ......
//主要逻辑参照官方的**PtrClassicDefaultHeader.java**实现,代码官方类都有。这里不方便多写,但是不难,基本逻辑都一样。说白了就是替换,窗户纸一层。
}

MyPtrFrameLayout.java

//该类主要参照官方的**PtrClassicFrameLayout.java**实现。代码总共没有多少行,纯替换。非重点就不啰嗦的贴代码了。

重要的知识点(*********)

  • 当我们的下拉刷新控件包裹了可滑动的视图布局时,当视图上滑出屏幕一部分时再下拉视图,会发现我们的视图滑出去的部分没有滑回来,而是出现了被下来控件headerview遮盖的情况。

  • 通过设置setPullToRefresh(boolean pull_2_fresh)方法可以设置释放刷新还是下拉过程中到达刷新边界自动刷新

经查资料,发现官方早已给我们封装好了默认的处理类。不废话,直接上代码:

//加入在MainActivity中使用了MyPtrFrameLayout下拉刷新控件布局
private void initView(){
frame = (MyPtrFrameLayout) view.findViewById(R.id.my_ptr_framelayout);
frame.setPullToRefresh(true);//true:下拉过程中刷新;false:释放刷新
frame.setLastUpdateTimeKey(HomePage.class.getName());
//以下代码是解决滑出视图被遮盖的关键:
//1. 使用官方提供的PtrDefaultHandler类
frame.setPtrHandler(new PtrDefaultHandler() { @Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
//2. 使用这个代码可以解决滑动冲突(*****),切记
return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header)&&!frame.isRefreshing();
} @Override
public void onRefreshBegin(PtrFrameLayout frame) {
//加载数据,回调刷新界面的代码
}
});
}

参考:
下拉刷新PtrFrameLayout组件的使用

作者:肖丹晨
链接:https://www.jianshu.com/p/c5c9985765bf
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

基于PtrFrameLayout实现自定义仿京东下拉刷新控件的更多相关文章

  1. Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

    前言: 忙完了结婚乐APP的开发,终于可以花一定的时间放在博客上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下目标效果以及demo效果:      因为此效果实现的步骤 ...

  2. android官方下拉刷新控件SwipeRefreshLayout的使用

    可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿出来分享. 简介:SwipeRefreshLayout组件只 ...

  3. [Android]下拉刷新控件RefreshableView的实现

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4172483.html 需求:自定义一个ViewGroup,实现 ...

  4. Android下拉刷新控件--PullToRefresh的简单使用

    Android中很多时候都会用到上下拉刷新,这是一个很常用的功能,Android的v4包中也为我们提供了一种原生的下拉刷新控件--SwipeRefreshLayout,可以用它实现一个简洁的刷新效果, ...

  5. Android 解决下拉刷新控件和ScrollVIew的滑动冲突问题。

    最近项目要实现ScrollView中嵌套广告轮播图+RecyleView卡片布局,并且RecyleView按照header和内容的排列样式,因为RecyleView的可扩展性很强,所以我毫无疑问的选择 ...

  6. Android——谷歌官方下拉刷新控件SwipeRefreshLayout(转)

    转自:http://blog.csdn.net/zouzhigang96/article/details/50476402 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言: 如今谷歌推出了 ...

  7. android SwipeRefreshLayout google官方下拉刷新控件

    下拉刷新功能之前一直使用的是XlistView很方便我前面的博客有介绍 SwipeRefreshLayout是google官方推出的下拉刷新控件使用方法也比较简单 今天就来使用下SwipeRefres ...

  8. Android PullToRefresh下拉刷新控件的简单使用

    PullToRefresh这个开源库早就听说了,不过一直没用过.作为一个经典的的开源库,我觉得还是有必要认识一下. 打开github上的网址:https://github.com/chrisbanes ...

  9. Android SwipeRefreshLayout 官方下拉刷新控件介绍

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...

随机推荐

  1. 牛客多校第六场 E Androgynos 自补图

    题意: 给定点数,构造自补图,要求输出邻接矩阵,和原图与补图的同构映射. 题解: 只有点数为4k和4k+1的情况才能构造自补图,因为只有这些情况下边数才为偶数. 一种构造方式是,邻接矩阵和同构映射增量 ...

  2. (34)C#异常

    一.异常的层次结构 二.异常格式 异常的一般格式 try { //可能会抛出异常的代码 } catch { //发现错误后会运行这里面的代码 } finally { //写不论是否出现异常都执行的代码 ...

  3. 批量更新mysql表数据

    1.批量更新表中某个字段,如果表比较大,每条记录都执行一条update,1s执行10条数据,10万条数据就要1W秒,3个多小时. 2.可以用case when 来实现,模板如下 UPDATE cate ...

  4. 压测:mysqlslap

    MySQL从5.1.4版开始带有一个压力测试工具mysqlslap,通过模拟多个并发客户端访问mysql来执行测试,使用起来非常简单,通过mysqlslap –help可以获得可用的选项.这里列一些主 ...

  5. Traveling by Stagecoach /// 状压DP oj22914

    题目大意: 输入n,m,p,a,b n是车票数(1<=n<=8),m是城市数(2<=m<=30) p是路径数(可能为0),a是起点,b是终点 接下来一行有n个数 为每张车票的马 ...

  6. Censored! POJ - 1625 AC自动机+大数DP

    题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...

  7. java笔试之求最大连续bit数

    功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1    输入: 一个byte型的数字    输出: 无     返回: 对应的二进制数字中1 ...

  8. Markdown语法--整理

    Markdown基本语法 [TOC] 优点: 1.因为是纯文本,所以只要支持Markdown的地方都能获得一样的编辑效果,可以让作者摆脱排版的困扰,专心写作. 2.操作简单.比如:word编辑时标记个 ...

  9. 通过真值树解析布尔表达式(eg:A&B|C)

    第一步:求出一个表达式的truth tree 1.生成真值表 2.根据真值表生成真值树(合并短路产生相同的两个子树) /**************************************** ...

  10. 漫说安全|智能的云WAF,开挂的Web防御

    “漫说安全”是我们推出的一个新栏目,以简洁明了的形式展现高深晦涩的云安全. 今天我们要讲的是智能的云WAF到底有啥“本领”,答案就在漫画里^_^ 漫画看完后估计你还会有些小疑问,不要着急,安全君特意准 ...