zoukankan      html  css  js  c++  java
  • 基于PtrFrameLayout实现自定义仿京东下拉刷新控件

    前言
    最近基于项目需要,使用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
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    Eclipse常见配置及常用插件
    杂记
    表单双引号问题
    兼容ie的jquery ajax文件上传
    Markdown 學習
    jstl c标签
    java 在接口里函数不能重载?
    【转】Eclipse里项目名有红叉,但是展开后里面又没有红叉叉
    Android性能优化之一:ViewStub
    Merge用法
  • 原文地址:https://www.cnblogs.com/Jeely/p/11060111.html
Copyright © 2011-2022 走看看