android简易下拉框架实现

2023-10-27

以前一直想写一个自己用的下拉插件,最近自己也看了很多的下拉插件。所以总结了一下,自己写了一个下拉刷新插件。实现的这个下拉刷新的框架,并不是自己的原创,在完成过程中是参考了很多开源的框架,并把自己认为比较好的东西借鉴了过来,从而形成我的东西。

实现原理

1、LoadingLayout是实现刷新头部和尾部布局的主要文件,而CustomLayout则继承自LoadingLayout的抽象类,它定义了一些自定义方法。在LoadingLayout中声明了刷新文字、时间、图片等设置和状态的改变方法。

【1】Header

Headr布局文件主要是实现下拉动画实现,据下拉的距离来改变它的状态,从而显示不同的样式。

【2】Footer

Footer布局文件是自动加载更多等状态显示已经上拉刷新状态改变,从而显示不停的样式。

2、PullRefreshBase是这个刷新框架最重要的基本组件。它是一个继承LinearLayout的抽象类,主要是实现了刷新视图T与Header和Footer以及手势滑动、状态改变的处理逻辑。由于传入的是泛型T,所以它可以支持多种刷新组件的组合。比如LinearLayout、GridView、WebView、RecycleView等,同时也可以传入自己的自定义视图来实现。

【1】OnRefreshListener刷新接口监听。
   /**
    * 下拉松手后调用
    *
    * @param refreshView 刷新的view
    */
   void onPullDownRefresh(final PullRefreshBase<V> refreshView);

    /**
     * 加载更多或上拉时调用
     *
     * @param refreshView 刷新的view
     */
    void onPullUpToRefresh(final PullRefreshBase<V> refreshView);
【2】通过对onInterceptTouchEvent方法重写,来对Touch进行拦截来判断滑动手势的操作。同时再根据是否拦截判断是否要传递给子视图。而onTouchEvent方法则根据拦截操作的标识来判断是否消费事件,不然就传递给父视图操作。

  /**
     * Touch事件拦截器
     *
     * @param event
     * @return
     */
    @Override
    public final boolean onInterceptTouchEvent(MotionEvent event) {
        if (!isInterceptTouchEventEnabled()) {
            return false;
        }

        if (!isPullLoadEnabled() && !isPullRefreshEnabled()) {
            return false;
        }

        final int action = event.getAction();
        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
            mIsHandledTouchEvent = false;
            return false;
        }

        if (action != MotionEvent.ACTION_DOWN && mIsHandledTouchEvent) {
            return true;
        }

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                mLastMotionY = event.getY();
                mIsHandledTouchEvent = false;
                break;

            case MotionEvent.ACTION_MOVE:
                final float deltaY = event.getY() - mLastMotionY;
                final float absDiff = Math.abs(deltaY);
                // 这里有三个条件:
                // 1,位移差大于mTouchSlop,这是为了防止快速拖动引发刷新
                // 2,isPullRefreshing(),如果当前正在下拉刷新的话,是允许向上滑动,并把刷新的HeaderView挤上去
                // 3,isPullLoading(),理由与第2条相同
                if (absDiff > mTouchSlop || isPullRefreshing() || isPullLoading()) {
                    mLastMotionY = event.getY();
                    // 第一个显示出来,Header已经显示或拉下
                    if (isPullRefreshEnabled() && isReadyForPullDown()) {
                        // 1,Math.abs(getScrollY()) > 0:表示当前滑动的偏移量的绝对值大于0,表示当前HeaderView滑出来了或完全
                        // 不可见,存在这样一种case,当正在刷新时并且RefreshableView已经滑到顶部,向上滑动,那么我们期望的结果是
                        // 依然能向上滑动,直到HeaderView完全不可见
                        // 2,deltaY > 0.5f:表示下拉的值大于0.5f
                        mIsHandledTouchEvent = (Math.abs(getScrollYValue()) > 0 || deltaY > 0.5f);
                        // 如果截断事件,我们则仍然把这个事件交给刷新View去处理,典型的情况是让ListView/GridView将按下
                        // Child的Selector隐藏
                        if (mIsHandledTouchEvent) {
                            mRefreshableView.onTouchEvent(event);
                        }
                    } else if (isPullLoadEnabled() && isReadyForPullUp()) {
                        // 原理如上
                        mIsHandledTouchEvent = (Math.abs(getScrollYValue()) > 0 || deltaY < -0.5f);
                    }
                }
                break;

            default:
                break;
        }

        return mIsHandledTouchEvent;
    }

3、总体布局视图

这里写图片描述

基本组件

1、框架内置提供PullRefreshRecyclerview,PullRefreshListView,PullRefreshWebView这三种刷新组件。PullRefreshRecyclerview最强大,它可以实现LinearView和GridView。而之所以提供PullRefreshListView,是主要供自定义的ListView和adapter来实现速度更快和多种样式的ListView。

【1】PullRefreshRecyclerview是一个自定义的下拉刷新RecyclerView扩展。我们知道RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能。可以支持GridView与ListView,它的功能更加强大。

这里主要参考了HeaderAndFooterRecyclerViewLRecyclerView

RecyclerAdapter:这个adapter是继承RecyclerView.Adapter的抽象类。主要封装了实现Header、Footer和Contents之间逻辑处理的关系。主要包括:

 /**
  * 点击事件接口
  */
  public interface OnItemClickLitener {
     void onItemClick(View view, int position);
     boolean onItemLongClick(View view, int position);
  }


  void addHeaderView(View header)
  void addFooterView(View footer) 
  int getCount()

 /**
  *数据处理逻辑
  */
  void add(D object)
  void addAll(Collection<? extends D> collection)
  void addAll(D[] items)
  void insert(D object, int index)
  void insertAll(D[] object, int index)
  void insertAll(Collection<? extends D> object, int index)
  void remove(D object)
  void remove(int position)
  void clear()
  void sort(Comparator<? super D> comparator) 


 /**
  * 创建视图,交给子类实现方法
  *
  * @param parent
  * @param viewType
  * @return
  */
 public abstract BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType);

BaseViewHolder:这个ViewHolder是继承RecyclerView.ViewHolder的抽象类,主要是将视图处理与adapter的逻辑处理分离开来了。因此更加便于处理和操作。在建立adapter时就会要求生成BaseViewHolder。

以上RecyclerAdapter和BaseViewHolder主要参考了EasyRecyclerView

【2】PullRefreshListView是一个自定义的下拉刷新ListView扩展。之所以保留是为了更加方便的自定义和使用自己定义的adapter。
【3】PullRefreshWebView是一个自定义的下拉刷新WebView扩展。只支持下拉刷新。

2、框架内包括了几种常用的基本刷新样式,Headr样式主要包括:DefaultHeaderLoadingLayout、IndicatorViewHeaderLoadingLayout、ProgressBarHeaderLoadingLayout、RotateHeaderLoadingLayout这几种,当然你可以自定义自己的样式。Footer样式主要括:DefaultFooterLoadingLayout、IndicatorViewFooterLoadingLayout。

【1】header样式是继承CustomLoadingLayout,主要是覆盖某些必要的方法,如果要自定义可以参考DefaultHeaderLoadingLayout的样式和布局来操作。footer样式和header样式是一样的继承CustomLoadingLayout,只是处理的逻辑和显示的文字少一些。
【2】样式截图:
a、hader样式:

DefaultHeaderLoadingLayout:

这里写图片描述

IndicatorViewHeaderLoadingLayout:

这里写图片描述

ProgressBarHeaderLoadingLayout:

这里写图片描述

RotateHeaderLoadingLayout:

这里写图片描述

b、footer样式:

DefaultFooterLoadingLayout:

这里写图片描述

IndicatorViewFooterLoadingLayout:

这里写图片描述

具体用法请看demo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android简易下拉框架实现 的相关文章

随机推荐

  • 这些 Shell 分析服务器日志命令集锦,收藏好

    自己的小网站跑在阿里云的ECS上面 偶尔也去分析分析自己网站服务器日志 看看网站的访问量 看看有没有黑阔搞破坏 于是收集 整理一些服务器日志分析命令 大家可以试试 1 查看有多少个IP访问 awk print 1 log file sort
  • React组件设计实践总结04 - 组件的思维

    在 React 的世界里 一切都是组件 组件可以映射作函数式编程中的函数 React 的组件和函数一样的灵活的特性不仅仅可以用于绘制 UI 还可以用于封装业务状态和逻辑 或者非展示相关的副作用 再通过组合方式组成复杂的应用 本文尝试解释用
  • Java并发编程实战——线程池ThreadPoolExecutor实现原理

    文章目录 为什么要使用线程池 线程池的工作原理 线程池的创建 BlockingQueue execute 方法 如何合理配置线程池参数 之前在 RabbitMQ池化方案中提到过线程池 本节我们加深理解 为什么要使用线程池 在实际使用中 线程
  • sessionID的本质、保存在哪里?

    一 客户端用cookie保存了sessionID 客户端用cookie保存了sessionID 当我们请求服务器的时候 会把这个sessionID一起发给服务器 服务器会到内存中搜索对应的sessionID 如果找到了对应的 session
  • 如何在ios真实设备上调试程序,真机测试软件信任问题

    所用机型为iPhone 13 本文主要讨论如何 信任开发人员 也就是app传到设备上后打不开的问题 全过程原链接奉上 https blog csdn net cunjie3951 article details 106923536 ops
  • docker查看日志的方式

    docker查看日志的几个方式 1 docker logs tail 1000 容器名称 查看容器前多少行的日志 推荐 2 docker 容器启动后 可以进入以下位置查看日志 var lib docker containers 容器ID 容
  • 【C语言】指针(一) — 指针的定义

    目录 一 什么是指针 二 指针变量的定义 三 指针变量的赋值 四 通过指针访问变量 一 什么是指针 以我的理解 指针就是存储地址的变量 在C语言中 对于变量的访问形式之一就是先求出变量的地址 然后再通过地址对它进行访问 这就是指针及指针变量
  • YoloV8改进策略:VanillaNet极简主义网络,大大降低YoloV8的参数

    文章目录 摘要 论文翻译 论文摘要 1 简介 2 普通的神经网络架构 3 普通网络的训练 3 1 深度训练策略 3 2 串联的激活函数 4 实验 4 1 消融研究 4 2 注意可视化 4 3 与SOTA体系结构的比较 4 4 COCO实验
  • 在一个普通的html文件中引入es6

    我们在日常开发中 如果我们使用es5则可以直接在浏览器里面写JavaScript脚本 一点问题也没有 但是在写es6语法的JavaScript代码的时候 我们就需要引入babel翻译器了
  • pytorch中的dropout

    为了防止过拟合 我们可以对网络实行dropout操作 有三种方法可以实现 torch nn functional dropout input p training self training 该种方法实现时必须标明training的状态为s
  • 测试学习13(正交表、测试用例力度、软件缺陷)

    正交表 从全面实验中挑选出有代表性的点进行测试 均匀分散 整齐可比 高效率 快速 经济的方法 正交排列法 正交实验设计 特点 均匀分散 齐整可比 正交表的概念 使用步骤 案例1 映射到选择好的正交表中 使用正交表的局限性 混合正交表 在实际
  • replaceAll、replace、replaceFirst(字符串多个元素替换)

    一 替换字符串中的多个字符 前言 Java中替换字符串可以用replace和replaceAll这两种 区别是 replace的参数是char和CharSequence 即可以支持字符的替换 也支持字符串的替换 CharSequence即字
  • flask_wtf中的参数介绍(StringField,PasswordField...)

    WTForms支持的HTML标准字段 字段类型 说 明 StringField 文本字段 TextAreaField 多行文本字段 PasswordField 密码文本字段 HiddenField 隐藏文本字段 DateField 文本字段
  • 【Java基础】IO流(二)

    个人简介 gt 个人主页 是Lay的主页 gt 学习方向 JAVA后端开发 gt 种一棵树最好的时间是十年前 其次是现在 gt 往期文章 Java基础 File类 IO流 gt 喜欢的话麻烦点点关注喔 你们的支持是我的最大动力 目录 1 字
  • Kali Linux网络攻击

    文章目录 一 Kali Linux 使主机和虚拟机IP处于同一网段 1 关机 点击edit 虚拟机 2 网络连接 选择桥接bridge模式 3 现在开机 就和主机在同一网段下 可以fping g查找其它的IP地址了 二 查看局域网下所有ip
  • SpringBoot自动配置原理

    说明 在阅读本篇文章之前建议大家先详细学习一下spring的相关知识 有助于更深刻的理解spirngboot的配置原理 目录 一 什么是springboot自动配置 二 Starter组件 三 三大注解 四 EnableAutoConfig
  • iOS开发:苹果开发者账号第一次新建APP ID以及创建App的步骤

    在iOS开发过程中 关于苹果开发者账号相关操作的知识点也是不可忽视的 尤其是对于一些刚接触苹果开发的开发者来说 更应该多了解一些关于苹果开发者账号的知识点 这样有利于App的测试和上架 苹果开发者账号相关知识大概分为两个部分 第一部分就是苹
  • Mysql进阶优化篇03——多表查询的优化

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 mysql基础 进阶 主要讲解mysql数据库sql刷题 进阶知识 包括索引 数据库调优 分库分表等 文章简介 本文将介绍多表查询的sql优化 绝
  • 并发线程 ( 3 ) - C++多线程并发同步【详解:条件变量/安全队列/future/promise/packaged_task/boost::thread_group等使用】

    系列文章目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 期待你的关注哦 有更多博文系列等着看哦 会经常更新 因为你的关注激励着我的创作 青春是薄脆的蛋壳 你总要打破它 去经
  • android简易下拉框架实现

    以前一直想写一个自己用的下拉插件 最近自己也看了很多的下拉插件 所以总结了一下 自己写了一个下拉刷新插件 实现的这个下拉刷新的框架 并不是自己的原创 在完成过程中是参考了很多开源的框架 并把自己认为比较好的东西借鉴了过来 从而形成我的东西