Android学习之基础知识五—RecyclerView(滚动控件)
RecyclerView可以说是增强版的ListView,不仅具有ListVIew的效果,还弥补许多ListView的不足。
一、RecyclerView的基本用法
与百分比布局类似,RecyclerView也属于新增的控件,为了使RecyclerView在所有Android版本上都能使用,Android团队采取了同样的方式,将RecyclerView定义在了support库当中。因此想要使用RecyclerView这个控件,首先需要在项目的build.gradle中添加相应的依赖库才行。
第一步:打开app/build.gradle文件,在dependencies闭包中添加:
implementation 'com.android.support:recyclerview-v7:27.1.1'

添加完成后,需要点击右上角的Sync Now
第二步:在activity_mian.xml中添加RecyclerView控件,控件宽度和高度都设置为与父布局一致,注意:RecyclerView不是内置在系统的SDK中,所以要把完整的包路径写出来。

第三步:创建Fruit实体类,定义两个字段:水果名称、水果图片id,每个字段定义一个get()方法,用于获取字段,定义一个构造函数,传入两个字段。

第四步:创建水果子项布局fruit_item.xml,添加水果图片控件(ImageView)、水果名称控件(TextView)

第五步:自定义适配器FruitAdapter,继承RecyclerView.Adapter,泛型指定为:FruitAdapter.ViewHolder


第六步:在MainActivity中完成适配器配置

第七步:运行程序,滑动屏幕,和上一章ListView的效果一样
   
二、RecyclerView实现横向滑动
第一步:修改fruit_item.xml中的代码(Fruit子项布局)
1、orientation="vertical":将子项布局方式改为垂直(控件与框架之间垂直排列),宽度改为“100dp”,设为固定值是为了防止子项因为水果文字的长短而有长有短,显得非常不美观
2、layout_gravity="center_horizontal":将水果图片和水果名称都设置为在布局中水平居中
3、layout_marginTop:让文字和图片之间保持一段距离。

第二步:在MainActivity中,设置布局的排列方向:setOrientation()方法,默认是纵向排列,横向排列:LinearLayoutManager.HORIZONTAL

第三步:运行程序,滑动屏幕效果如下
   
三、RecyclerView实现瀑布流布局
除了LinearLayoutManager之外,RecyclerView还提供了GridLayoutManager和StaggeredGridLayoutManager这两种内置的布局排列方式,GridLayoutManager可以实现网格布局,StaggeredGridLayoutManager可以用于实现瀑布流布局,下面我们就来实现一下瀑布流布局。
第一步:修改fruit_item.xml中的代码
1、将LinearLayout的宽度改为:match_parent,因为瀑布流布局的宽度应该由布局的列数来自动适配
2、layout_margin属性:使每个子项之间都互留一定的间距,不至于贴得太近。

第二步:将布局排列方式改为瀑布流布局:StaggeredGridLayoutManager
StaggeredGridLayoutManager()构造函数中传入两个参数:
第一个参数:用于指定布局的列数,4表示指定布局的列数为4列。
第二个参数:用于指定布局的排列方向:StaggeredGridLayoutManager.VERTICAL(布局纵向排列)

第三步:运行程序,上下滑动屏幕效果如下:
   
四、RecyclerView的点击事件
和ListView一样,RecyclerView也必须要有点击事件才行,但是不同于ListView 的点击事件,RecyclerView没有提供类似于:setOnItemClickListener()这样的注册监听器方法,而是需要我们自己给子项具体的View去注册点击事件,相比ListView来说,实现要复杂一点。
为什么要这么做呢?这是因为ListView在点击事件上的处理并不人性化,setOnItemClickListener()方法注册的是子项的点击事件,而不是子项里具体某个按钮的点击事件,虽然ListView也能够实现点击子项里面某个具体的按钮,但是实现起来相对比较麻烦。所以RecyclerView直接摒弃了子项点击事件的监听器,所有的点击事件都由具体的View去注册,就没有这个困扰了。
下面具体来看看RecyclerView中的注册点击事件。
第一步:在FruitAdapter适配器中注册点击事件
1、在ViewHolder中保存水果子项最外层布局实例
2、在onCreateViewHolder中注册监听事件
viewHolder.fruitView.setOnClickListener():子项最外层布局的点击事件
viewHolder.fruitImage.setOnClickListener():水果图片的点击事件


第二步:运行程序,分别点击图片和文字,效果如下:
1、点击Apple图片,触发了ImageView的点击事件:显示:You Clicked imageApple
2、点击Banana文字,由于TextView没有注册点击事件,被子项最外层布局捕获到了,因此显示:You Clicked viewBanana
   
Android学习之基础知识五—RecyclerView(滚动控件)的更多相关文章
- Android学习之基础知识五—创建自定义控件
		
下面是控件和布局的继承关系: 从上面我们看到: 1.所有控件都是直接或间接继承View,所有的布局都是直接或间接继承ViewGroup 2.View是Android中最基本的UI组件,各种组件其实就是 ...
 - Android学习之基础知识五—Android常用的七大控件
		
一.TextView控件:在界面上显示一段文本信息 先看XML代码和执行效果: 代码分析: 1.android:id属性,给当前控件定义了一个唯一的标识符 2.android:layo ...
 - Android学习之基础知识五—ListView控件(最常用和最难用的控件)
		
ListView控件允许用户通过上下滑动来将屏幕外的数据拉到屏幕内,把屏幕内的数据拉到屏幕外. 一.ListView的简单用法第一步:先创建一个ListViewTest项目,在activity_mia ...
 - Android学习之基础知识五—编写聊天界面
		
第一步:在app/build.grandle添加RecyclerView依赖库 第二步:在activity_main.xml文件中编写主界面:聊天.发送框.发送按钮三个部分 第三步:编写Message ...
 - Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
		
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
 - Android学习之基础知识十—内容提供器(Content Provider)
		
一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...
 - Android学习之基础知识十六 — Android开发高级技巧的掌握
		
一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...
 - Android学习之基础知识十四 — Android特色开发之基于位置的服务
		
一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...
 - Android学习之基础知识十三 — 四大组件之服务详解第一讲
		
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
 
随机推荐
- Spring容器的初始化流程
			
一.创建BeanFactory流程 1.流程入口 创建BeanFactory的流程是从refresh方法的第二步开始的,通过调用obtainFreshBeanFactory方法完成流程. Config ...
 - linux shell脚本之-变量极速入门与进阶(2)
			
1,$$:显示当前的进程id号 ghostwu@dev:~/linux/shell/how_to_use_var$ cat show_pid.sh #!/bin/bash echo $$ ghostw ...
 - Python 单例设计模式
			
class Foo: def __init__(self, name, age): self.name = name self.age = age def show(self): print(self ...
 - Arrow模块生成时间
			
import arrow def isLeapYear(years): ''' 通过判断闰年,获取年份years下一年的总天数 :param years: 年份,int :return:days_su ...
 - 【读书笔记】iOS-如何选择本地化应用
			
早在2007年发布iPhone的时候 ,苹果并没有一同发布本地化SDK,苹果公司声称不需要本地SDK,鼓励大家使用JavaScript,CSS和HTML开发Web应用.但接下来剧情并没有按照苹果设计的 ...
 - HTML语言和CSS开发
			
第一张 HTML基础1.HTML:超文本标记语言(它除了文字,还能写图片.视频.音频.交互),他不是编程语言,它是标记语言2. <!DOCTYPE html> HTML5版本申明 < ...
 - yolo.h5制作方法
			
学习吴恩达的深度学习第三课缺少yolo.h5文件,花了很长时间来解决这个问题. 看到CSDN上各种需要积分下载的yolo.h5文件,实在看不下去了. 从 https://github.com/alla ...
 - January 06th, 2018 Week 01st Saturday
			
In life the most interesting things tend to happen when you are on your way to do something else. 生活 ...
 - SQL注入的绕过
			
一.常用符号的绕过 1.空格 1 空格代替:+ %20 %09 %0a %0b %0c %0d %a0 %00 /**/ /*!*/ 2 括号绕过:常用于基于时间延迟的盲注,例如构造语句: ?id=1 ...
 - Java引用类型转换
			
java的引用类型转换分为两种: 向上类型转换,是小类型到大类型的转换 向下类型转换,是大类型到小类型的转换 现存在一个Animal动物类,猫子类和狗子类继承于Animal父类: 1 public c ...