Android界面设计:Material Design之下拉刷新

2023-11-13

下拉刷新的核心类: SwipeRefreshLayout

下拉刷新这种功能并不是什么新鲜的东西,所有的应用里都会有这个功能
把想要实现下拉刷新功能的控件放置到SwipeRefreshLayout中,就可以迅速让这个控件支持下拉刷新
使用SwipeRefreshLayout之前首先需要在app/build.gradle文件中dependencies的闭包添加如下依赖:

implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0

修改activity_main.xml中的代码

<androidx.drawerlayout.widget.DrawerLayout
	 xmlns:android="http://schemas.android.com/apk/res/android"
	 xmlns:app="http://schemas.android.com/apk/res-auto"
	 android:id="@+id/drawerLayout"
	 android:layout_width="match_parent"
	 android:layout_height="match_parent">
	 
	 <androidx.coordinatorlayout.widget.CoordinatorLayout
		 android:layout_width="match_parent"
		 android:layout_height="match_parent">
		 ...
		 <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
			 android:id="@+id/swipeRefresh"
			 android:layout_width="match_parent"
			 android:layout_height="match_parent"
			 app:layout_behavior="@string/appbar_scrolling_view_behavior">
			 
		 <androidx.recyclerview.widget.RecyclerView
			 android:id="@+id/recyclerView"
			 android:layout_width="match_parent"
			 android:layout_height="match_parent"
			 app:layout_behavior="@string/appbar_scrolling_view_behavior" />
			 
		 </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
		 ...
	 </androidx.coordinatorlayout.widget.CoordinatorLayout>
	 ...
</androidx.drawerlayout.widget.DrawerLayout>

这里在RecyclerView的外面又嵌套了一层SwipeRefreshLayout,这样RecyclerView就自动拥有下拉刷新功能了
由于RecyclerView现在变成了SwipeRefreshLayout的子控件,因此之前使用app:layout_behavior声明的布局行为现在也要移到SwipeRefreshLayout中才行

不过这还没有结束,虽然RecyclerView已经支持下拉刷新功能了,但是还要在代码中处理具体的刷新逻辑才行。修改MainActivity中的代码,如下所示:

class MainActivity : AppCompatActivity() {
	 ...
	 override fun onCreate(savedInstanceState: Bundle?) {
		 super.onCreate(savedInstanceState)
		 setContentView(R.layout.activity_main)
		 ...
		 swipeRefresh.setColorSchemeResources(R.color.colorPrimary)
		 swipeRefresh.setOnRefreshListener {
		 	refreshFruits(adapter)
		 }
	 }
	 
	 private fun refreshFruits(adapter: FruitAdapter) {
		 thread {
			 Thread.sleep(2000)
			 runOnUiThread {
				 initFruits()
				 adapter.notifyDataSetChanged()
				 swipeRefresh.isRefreshing = false
			 }
		 }
	 }
	 ...
}

首先调用SwipeRefreshLayout的setColorSchemeResources()方法来设置下拉刷新进度条的颜色,这里就使用主题中的colorPrimary作为进度条的颜色了
接着调用setOnRefreshListener()方法来设置一个下拉刷新的监听器,当用户进行了下拉刷新操作时,就会回调到Lambda表达式当中,然后在这里去处理具体的刷新逻辑就可以了
这里简单起见,就不和网络进行交互了,而是调用一个refreshFruits()方法进行本地刷新操作>refreshFruits()方法中先是开启了一个线程,然后将线程沉睡两秒钟。之所以这么做,是因为本地刷新操作速度非常快,如果不将线程沉睡的话,刷新立刻就结束了,从而看不到刷新的过程
沉睡结束之后,这里使用了runOnUiThread()方法将线程切换回主线程,然后调用initFruits()方法重新生成数据,接着再调用FruitAdapter的notifyDataSetChanged()方法通知数据发生了变化,最后调用SwipeRefreshLayout的setRefreshing()方法并传入false,表示刷新事件结束,并隐藏刷新进度条

运行程序,在屏幕的主界面向下拖动,会有一个下拉刷新的进度条出现,松手后就会自动进行刷新了
在这里插入图片描述
下拉刷新的进度条只会停留两秒钟,之后就会自动消失,界面上的水果数据也会随之更新

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

Android界面设计:Material Design之下拉刷新 的相关文章

随机推荐

  • C0177 [2004普及组-A]不高兴的津津(C语言写)

    题目描述 津津上初中了 妈妈认为津津应该更加用功学习 所以津津除了上学之外 还要参加妈妈为她报名的各科复习班 另外每周妈妈还会送她去学习朗诵 舞蹈和钢琴 但是津津如果一天上课超过八个小时就会不高兴 而且上得越久就会越不高兴 假设津津不会因为
  • 音频PCM数据的单声道、双声道之间的转换

    在使用tinyalsa处理PCM音频数据时发现该设备只能以双声道形式打开设备 tinypcminfo工具可以查看设备信息 out和in里面channels 最大和最小值都是2 但是实际使用中有时候又需要声卡采集和播放单声道数据怎么办 那就只
  • 入门级题解3. 无重复字符的最长子串

    题目 给定一个字符串 s 请你找出其中不含有重复字符的最长子串的长度 思路 这样一来 我们就可以使用 滑动窗口 来解决这个问题了 我们使用两个指针表示字符串中的某个子串 或窗口 的左右边界 其中左指针代表着上文中 枚举子串的起始位置 而右指
  • Niagara官方示例笔记 - 盘点自带重要模块

    Emitter State life cycle生命周期控制 发射器选择system 所有发射器都在system的state里设置生命周期 选择self 发射器独立控制 可以给发射器创建不同类型变量 使用set parameter模块计算
  • 【Vegas原创】ORA-16040 standby destination archive log file is locked解决

    ORA 16040 standby destination archive log file is locked Cause The target standby destination archive log file is curren
  • serverless与容器优缺点

    容器优势 1 可移植性 使用容器 开发人员可以确保他们的应用程序可以在任何云平台或本地服务器上运行 2 轻量化 容器镜像以层叠加 在本地拥有镜像层缓存 计算资源使用方面 容器也比虚拟机更高效 3 快速启动 容器启动在镜像只读层上叠加一层读写
  • 谈谈我们公司如何做Code Review

    研发中心团队越来越庞大了 开发人员越来越多了 和他们聊天过程中 发现开发人员对代码技能的提升很迷茫 诉求越来越浓厚 只不过一个接一个的项目交付没有给他们太多停留的时间 在这种情况下如何给团队营造浓厚的工程师交流氛围呢 方法有多种 最近进行了
  • 35+老测试员生涯回顾,揭秘无力吐槽的自动化真相…

    不知道从什么时候开始 软件测试行业就和 自动化 这个词联系在一起了 对于如今的测试人来说 几乎没有人不知道 自动化测试 甚至查看各大招聘网站 你从任何一个招聘渠道来看最近两年对测试岗位的要求 几乎都要求会自动化测试 而不少人一直认为手工测试
  • JS获取阴历+阳历时间

    1 阴历 获取阴历 start getLunar var nyear var nmonth var nday 1 var nwday var nhrs var nmin var nsec var lmonth lday lleap 农历参数
  • 海思麒麟985性能简介

    海思麒麟985 SoC由中国台湾积体电路制造有限公司打造 是麒麟980的升级改良版 率先使用7nm工艺制作 是对上一代10nm芯片的改进 主要在功耗和性能上做了较大改进 麒麟985大致参数为1 3 4 CPU架构 8核Mali G77 GP
  • mali GPU 官网指南

    1 简介 GPU 图形处理单元 是一种专门在个人电脑 工作站 游戏机和移动设备上图形运算工作的微处理器 以前GPU主要用于图形处理 现在GPU的通用计算技术也得到了飞速发展 事实证明在浮点运算 并行计算等部分计算方面 GPU可以提供数十倍乃
  • 【python】python如何从一个文件中引入另一个文件中的变量

    直接和导入python的函数一样导入变量名即可 十分方便 from target file import variant name
  • STM32学习笔记五、RST复位

    1 STM32硬复位 STM32片内已经有复位电路了 可以不外接复位电路 复位引脚一般不宜悬空 所以STM32在NRST引脚内接了一个上拉电阻 典型值为40K 为了防止外部干扰 STM32数据手册上建议外接一个对地电容 如果用户认为内部上拉
  • java后端接入微信小程序登录功能

    java后端接入微信小程序登录功能 前言 此文章是Java后端接入微信登录功能 由于项目需要 舍弃了解密用户信息的session key 只保留openid用于检索用户信息 后端框架 spring boot 小程序框架 uniapp 流程概
  • 【ROS】虚拟机VMware 安装ROS 一条龙教程+部分报错解决

    前言 Linux下安装ROS真是太多坑了 如何在Linux下安装ROS呢 博主带你少走弯路 目录 前言 第一步 配置软件源 1 打开设置 2 打开软件与更新 3 选源 第二步 设置sources list 第三步 设置密钥 第四步 正式安装
  • C#中断点不能调试问题(当前不会命中断点,还没有为该文档加载任何资料 )

    1 winform 程序中 经常会出现的一个错误 断点不可调试 1 当前不会命中断点 还没有为该文档加载任何资料 问题原因 窗口所在的类库或者项目在应用程序目录中 release或者debug 中只生成了dll文件 没有生成pdb文件 例如
  • css如何实现盒子在鼠标点,掌握CSS定位,才能让“盒子”飞得更高更远更稳

    众所周知 前端CSS中 盒模型 浮动 定位为必须掌握的三座大山 今天就来聊聊定位的那些事 定位是什么 先来看看哪些场景用到定位 如下图所示 凡是有盒子压住另一个盒子的地方都可定位 因为用浮动做不了 如果盒子浮动 会并排但不会出现有层级的观感
  • STM32F4 IAP

    功能实现 正常上电或复位后运行用户Bootloader程序 检查变量存储区的标志位 如果标志位为APP FLAG则跳转到APP程序运行 如果标志位为BOOT FLAG 则运行用户Bootloader程序 等待接收文件并准备IAP升级后跳转到
  • (数据挖掘-入门-8)基于朴素贝叶斯的文本分类器

    主要内容 1 动机 2 基于朴素贝叶斯的文本分类器 3 python实现 一 动机 之前介绍的朴素贝叶斯分类器所使用的都是结构化的数据集 即每行代表一个样本 每列代表一个特征属性 但在实际中 尤其是网页中 爬虫所采集到的数据都是非结构化的
  • Android界面设计:Material Design之下拉刷新

    目录 下拉刷新的核心类 SwipeRefreshLayout 下拉刷新的核心类 SwipeRefreshLayout 下拉刷新这种功能并不是什么新鲜的东西 所有的应用里都会有这个功能 把想要实现下拉刷新功能的控件放置到SwipeRefres