android 下拉刷新 组件,Android实现简单的下拉刷新控件

2023-11-10

背景:列表控件在Android App开发中用到的场景很多。在以前我们用ListView,GradView,现在应该大多数开发者都已经在选择使用RecyclerView了,谷歌给我们提供了这些方便的列表控件,我们可以很容易的使用它们。但是在实际的场景中,我们可能还想要更多的能力,比如最常见的列表下拉刷新,上拉加载。上拉刷新和下拉加载应该是列表的标配吧,基本上有列表的地方都要具体这个能力。虽然刷新这个功能已经有各种各样的第三方框架可以选择,但是毕竟不是自己的嘛,今天我们就来实现一个自己的下拉刷新控件,多动手才能更好的理解。

效果图:

fbee3ba6cf7069049954612b4d9f6c21.gif

原理分析:

在coding之前,我们先分析一下原理,原理分析出来之后,我们才可以确定实现方案。

先上一张图,来个直观的认识:

d25d4aed6b90b86f7c1f1efaacb4303c.png

在列表上面有个刷新头,随着手指向下拉,逐渐把顶部不可见的刷新头拉到屏幕中来,用户能看到刷新的状态变化,达到下拉刷新的目的。

通过分析,我们确定一种实现方案:我们自定义一个容器,容器里面包含两个部分。

1. 顶部刷新头。

2. 列表区域。

确定好布局容器之后,我们来分析刷新头的几种状态

00c084d9f4bee63d1a4899375c16e985.png

把下拉刷新分为5中状态,通过不同状态间的切换实现下拉刷新能力。

状态间的流程图如下:

cca104142520d49dc9e7d19bd2bae062.png

整个下拉刷新的流程就如图中所示。

流程清楚了之后,接下来就是编写代码实现了。

代码实现:

/**

* @author luowang8

* @date 2020-08-21 10:54

* @desc 下拉刷新控件

*/

public class PullRefreshView extends LinearLayout {

/**

* 头部tag

*/

public static final String HEADER_TAG = "HEADER_TAG";

/**

* 列表tag

*/

public static final String LIST_TAG = "LIST_TAG";

/**

* tag

*/

private static final String TAG = "PullRefreshView";

/**

* 默认初始状态

*/

private @State

int mState = State.INIT;

/**

* 是否被拖拽

*/

private boolean mIsDragging = false;

/**

* 上下文

*/

private Context mContext;

/**

* RecyclerView

*/

private RecyclerView mRecyclerView;

/**

* 顶部刷新头

*/

private View mHeaderView;

/**

* 初始Y的坐标

*/

private int mInitMotionY;

/**

* 上一次Y的坐标

*/

private int mLastMotionY;

/**

* 手指触发滑动的临界距离

*/

private int mSlopTouch;

/**

* 触发刷新的临界值

*/

private int mRefreshHeight = 200;

/**

* 滑动时长

*/

private int mDuring = 300;

/**

* 用户刷新监听器

*/

private OnRefreshListener mOnRefreshListener;

/**

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

android 下拉刷新 组件,Android实现简单的下拉刷新控件 的相关文章

随机推荐

  • nodejs链接mysql报错_nodejs连接数据库报错

    ER NOT SUPPORTED AUTH MODE 报错详情 使用nodejs连接数据库时报错 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication
  • Blockly概述

    原文地址 https developers google com blockly guides overview Blockly是一个用于Web Android IOS的可视化代码编辑器库 Blockly使用了相互关联的积木来表示表达代码中
  • ES 搜索22 (function_score 支持的衰减函数 linear、exp 和 gauss)

    衰减函数 很多变量都可以影响用户对于酒店的选择 像是用户可能希望酒店离市中心近一点 但是如果价格足够便宜 也愿意为了省钱 妥协选择一个更远的住处 如果我们只是使用一个 filter 排除所有市中心方圆 100 米以外的酒店 再用一个filt
  • 关于根轨迹对于控制系统的一点理解

    自动控制理论根轨迹的学习过程中 经常会遇到几个问题 为什么要用根轨迹法 为什么根轨迹法最终转化为调整增益K来反应系统的稳定性和动态性能 为什么根轨迹法用开环传递函数求解的却是闭环极点 盲目的借助于matlab进行根轨迹的计算和绘图 有时候往
  • MySQL采用B+树作为索引的原因

    MySQL采用B 树作为索引的原因 1 MySQL的索引结构是如何查询的 在MySQL中 存储的数据记录都是持久化到磁盘中的 数据包含索引和记录 当MySQL查询数据时 由于索引也是持久化在磁盘上面的 首先会从磁盘上读取索引到缓存中 然后再
  • 【计算机网络】JWT(JSON Web Token)初识

    JWT JSON Web Token 初识 JWT JSON Web Token 是目前最流行的跨域认证解决方案 1 跨域认证的问题 互联网服务离不开用户认证 一般流程是下面这样 用户向服务器发送用户名和密码 服务器验证通过后 在当前对话
  • jQuery实现MD5加密

    原文地址 http blog csdn net you23hai45 article details 52629234 1 问题背景 有两个输入框 一个输入明文 另一个输入框显示密文 2 实现源码 html view plain copy
  • Linux平台的IO操作

    什么是IO如何理解IO IO就是输入与输出 I Input 从键盘拷贝数据至内存中 O Output 从内存中拷贝数据到终端上 因为Linux平台基本思想为 一切皆文件 所以 对于IO可以再次理解位 I 从文件中拷贝数据到内存中去 O 从内
  • WebService 学习笔记之一 HelloWorld

    一 开发环境 我的开发环境是 MyEclipse 10 Apache cxf 2 3 0 相关jar包下载地址 http www apache org dist cxf 2 3 0 二 开发步骤 创建Server 1 新建一个Java工程C
  • Linux/Android 充电框架/流程分析 1

    1 内核注册供电设备 内核通过 devm power supply register 或者 power supply register 注册供电相关的设备 2 获取电量的方式 电量是电池相关的信息 所以 注册的供电设备为 battery 例
  • [深入研究4G/5G/6G专题-46]: 5G Link Adaption链路自适应-2-常见缩略语

    A CSI Aperiodic Channel Status Information 非周期性信道状态信息 AL Aggregation level for PDCCH 聚合等级 ATB Adaptive Transmission Band
  • 如何从一个git服务器仓库将项目迁移到另一个git服务器仓库

    最近服务器迁移涉及到代码也需要一块迁移 梳理了一些git服务迁移指令 希望大家共享 从服务器A迁移到服务器B 1 首先将服务器A上的代码进行备份 1 1 git备份指令 从A服务器 https gitlab xxxx cn 上clone代码
  • Kali环境下渗透目标(win7)虚拟机

    Kali环境下渗透目标 win7 虚拟机 注 此文章 是我看了CSDN上另一位博主的文章 我在自己在电脑上实验了一遍的结果 另外 本文仅供学习交流 用来做非法之事 本人概不负责 准备 1 在电脑上安装VMware 并下载安装虚拟机kali
  • pycharm运行YOLOv5 (一)

    登录github com search yolov5 查看选择各个版本 查看发布各个版本 点击下载版本 下载zip文件 解压之后导入pycharm 先看这个文件requirements txt 这是启动yolov5需要的各个库 pip in
  • docker启动rabbitmq后无法访问15672端口

    docker启动rabbitmq后无法访问15672端口 经查找资料得知 rabbitmq默认web界面管理插件是关闭的 只要通过命令开启就行 1 docker ps查看rabbitmq的id fb7a78201d31 2 命令进入容器do
  • vivado下载

    vitis vivado 2019 2百度网盘 链接 https pan baidu com s 11CvUL05o2NTRqN4PpnFG5Q 提取码 n82v vivado2018 2百度网盘 链接 https pan baidu co
  • javaEE 2019 10 24关于运算符 键盘录入数据

    运算符 对变量和常量的操作过程称为运算 对变量和常量进行操作的符号 运算符 算术运算符 加 减 乘 除 自增 自减 取模 字符串连接 赋值运算符
  • WEB前端 期末复习 2018.11

    WEB前端 期末复习 2018 11 名词解释部分 API Application Programming Interface 应用程序编程接口 是一些预先定义的函数 目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力 而又
  • kafka不同的topic使用相同的group的问题

    前几天为了省事 在申请group的时候 就使用了原来的group 本来以为group从属于某一个topic topic不同 group之间相互不会影响 但实际情况不是这样的 kafka不同topic的consumer如果用的groupid名
  • android 下拉刷新 组件,Android实现简单的下拉刷新控件

    背景 列表控件在Android App开发中用到的场景很多 在以前我们用ListView GradView 现在应该大多数开发者都已经在选择使用RecyclerView了 谷歌给我们提供了这些方便的列表控件 我们可以很容易的使用它们 但是在