文章目录

  • 一、循环器视图 - RecyclerView
    • (一)循环器视图概述
    • (二)循环器视图优点
    • (三)继承关系图
  • 二、案例演示 —— 展示学生列表
    • (一)运行效果
    • (二)涉及知识点
    • (三)实现步骤
      • 1、创建安卓应用【StudentList】
      • 2、给安卓应用添加对recyclerview库的依赖
      • 3、将图片素材拷贝到drawable目录
      • 4、主布局资源文件activity_main.xml
      • 5、列表项模板student_list_item.xml
      • 6、创建学生实体类 - Student
      • 7、主界面类 - MainActivity
      • 8、启动应用,查看效果
      • 9、修改布局管理器 - 设置item的布局方式
      • 10、给循环器视图设置列表项分割线
      • 11、查看主界面类源代码

一、循环器视图 - RecyclerView

(一)循环器视图概述

  • 谷歌公司自安卓5.0开始推出了一个用于大量数据展示的新控件RecylerView(回收视图),可以用来代替传统的ListView,使用起来更加强大、更加灵活。
  • RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,名字中的Recycler就有回收器之意。

(二)循环器视图优点

  • RecyclerView并不会完全替代ListView(注意:ListView并未被标记为@Deprecated),两者使用场景不一样。但RecyclerView会让很多开源项目被废弃,例如横向滚动的ListView和GridView、瀑布流控件,因为这些效果RecyclerView都能实现。
  • RecyclerView封装了ViewHolder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
  • 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其扩展性非常强。
  • 设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式。
  • 通过继承RecyclerView的ItemDecoration类,然后针对业务需求去书写代码。
  • 可以控制Item增删动画,通过ItemAnimator这个类进行控制,针对增删动画,RecyclerView有默认的实现。

(三)继承关系图

二、案例演示 —— 展示学生列表

(一)运行效果

(二)涉及知识点

  1. 标签(TextView)
  2. 线性布局(LinearLayout)
  3. 循环器视图(RecyclerView)
  4. 布局管理器(LayoutManager)
  5. 分割器项修饰(DividerItemDecoration)
  6. 数组列表(ArrayList)

(三)实现步骤

1、创建安卓应用【StudentList】


2、给安卓应用添加对recyclerview库的依赖

  • 打开【Project Structure】窗口,选择【Dependencies】
  • 添加库依赖 - recyclerview


  • 查看应用的Gradle配置文件

3、将图片素材拷贝到drawable目录

4、主布局资源文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:padding="15dp"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rvStudent"android:layout_width="match_parent"android:layout_height="match_parent"/>
</LinearLayout>

5、列表项模板student_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_vertical"android:orientation="horizontal"><ImageViewandroid:id="@+id/ivStudentIcon"android:layout_width="60dp"android:layout_height="60dp"android:src="@drawable/img1" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:gravity="center_vertical"android:orientation="vertical"><TextViewandroid:id="@+id/tvStudentName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:textColor="#0000ff"android:textSize="25sp" /><TextViewandroid:id="@+id/tvStudentPhone"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:textColor="#555555"android:textSize="20sp" /></LinearLayout>
</LinearLayout>

6、创建学生实体类 - Student

package net.hw.student_list;/*** 功能:学生实体类* 作者:华卫* 日期:2020年11月15日*/
public class Student {private int studentIcon;private String studentName;private String studentPhone;public int getStudentIcon() {return studentIcon;}public void setStudentIcon(int studentIcon) {this.studentIcon = studentIcon;}public String getStudentName() {return studentName;}public void setStudentName(String studentName) {this.studentName = studentName;}public String getStudentPhone() {return studentPhone;}public void setStudentPhone(String studentPhone) {this.studentPhone = studentPhone;}@Overridepublic String toString() {return "Student{" +"studentIcon=" + studentIcon +", studentName='" + studentName + '\'' +", studentPhone='" + studentPhone + '\'' +'}';}
}

7、主界面类 - MainActivity

  • 声明变量
  • 通过资源标识符获取控件实例
  • 初始化学生列表作为数据源
  • 给循环器视图设置布局管理器
  • 初始化循环器适配器
  • 继承RecyclerView.ViewHolder创建视图容器类
  • 编写创建视图容器方法
  • 编写绑定视图容器方法
  • 编写获取列表项个数
  • 给循环器视图设置适配器

8、启动应用,查看效果

9、修改布局管理器 - 设置item的布局方式

  • 之前给循环器视图设置布局管理器:rvStudent.setLayoutManager(new LinearLayoutManager(this));,只是使用了一个匿名线性布局管理器对象,因此无法利用它来设置item的布局方式。下面创建一个线性布局管理器对象,设置其Orientation属性。
  • 启动应用,查看效果
  • 重新设置方向 - 垂直的
  • 启动应用,查看效果

10、给循环器视图设置列表项分割线

  • 修改代码,给循环器视图添加项修饰
  • 启动应用,查看效果

11、查看主界面类源代码

package net.hw.student_list;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;import android.annotation.SuppressLint;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private RecyclerView rvStudent; // 学生循环器视图(展示)private RecyclerView.Adapter adapter; // 循环器适配器(桥梁)private List<Student> students; // 学生列表(数据源)@SuppressLint("WrongConstant")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局资源文件设置用户界面setContentView(R.layout.activity_main);// 通过资源标识符获取控件实例rvStudent = findViewById(R.id.rvStudent);// 获取学生列表作为数据源students = getStudents();// 创建线性布局管理器LinearLayoutManager layoutManager = new LinearLayoutManager(this);// 设置线性布局管理器方向属性(默认是VERTICAL)layoutManager.setOrientation(OrientationHelper.VERTICAL);// 给循环器视图设置布局管理器rvStudent.setLayoutManager(layoutManager);// 初始化循环器适配器adapter = new RecyclerView.Adapter() {/*** 视图容器*/class ViewHolder extends RecyclerView.ViewHolder {private ImageView ivStudentIcon;private TextView tvStudentName;private TextView tvStudentPhone;public ViewHolder(@NonNull View itemView, ImageView ivStudentIcon, TextView tvStudentName, TextView tvStudentPhone) {super(itemView);this.ivStudentIcon = ivStudentIcon;this.tvStudentName = tvStudentName;this.tvStudentPhone = tvStudentPhone;}public ImageView getIvStudentIcon() {return ivStudentIcon;}public TextView getTvStudentName() {return tvStudentName;}public TextView getTvStudentPhone() {return tvStudentPhone;}}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {// 获取视图对象(将列表项模板转换成视图)View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.student_list_item, parent, false);// 获取视图里的控件ImageView ivStudentIcon = view.findViewById(R.id.ivStudentIcon);TextView tvStudentName = view.findViewById(R.id.tvStudentName);TextView tvStudentPhone = view.findViewById(R.id.tvStudentPhone);// 创建视图容器RecyclerView.ViewHolder viewHolder = new ViewHolder(view, ivStudentIcon, tvStudentName, tvStudentPhone);// 返回视图容器return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {// 获取学生数据Student student = students.get(position);// 获取控件实例ImageView ivStudentIcon = ((ViewHolder)holder).getIvStudentIcon();TextView tvStudentName = ((ViewHolder)holder).getTvStudentName();TextView tvStudentPhone = ((ViewHolder)holder).getTvStudentPhone();// 设置控件属性ivStudentIcon.setImageResource(student.getStudentIcon());tvStudentName.setText(student.getStudentName());tvStudentPhone.setText(student.getStudentPhone());// 给控件设置监听器ivStudentIcon.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, student.getStudentName()+ " : " + student.getStudentPhone(), Toast.LENGTH_SHORT).show();}});tvStudentName.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, student.getStudentName()+ " : " + student.getStudentPhone(), Toast.LENGTH_SHORT).show();}});tvStudentPhone.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, student.getStudentName()+ " : " + student.getStudentPhone(), Toast.LENGTH_SHORT).show();}});}@Overridepublic int getItemCount() {return students.size();}};// 给循环器视图设置适配器rvStudent.setAdapter(adapter);// 给循环器视图添加列表项分隔线rvStudent.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}/*** @return 学生列表*/private List<Student> getStudents() {// 创建学生列表List<Student> students = new ArrayList<>();// 声明学生Student student = null;// 创建第1个学生student = new Student();student.setStudentIcon(R.drawable.img1);student.setStudentName("李晓红");student.setStudentPhone("15878782345");// 将学生添加到学生列表students.add(student);// 创建第2个学生student = new Student();student.setStudentIcon(R.drawable.img2);student.setStudentName("王晓玲");student.setStudentPhone("15956567890");// 将学生添加到学生列表students.add(student);// 创建第3个学生student = new Student();student.setStudentIcon(R.drawable.img3);student.setStudentName("董大伟");student.setStudentPhone("13567891230");// 将学生添加到学生列表students.add(student);// 创建第4个学生student = new Student();student.setStudentIcon(R.drawable.img4);student.setStudentName("尚洪文");student.setStudentPhone("18856789032");// 将学生添加到学生列表students.add(student);// 创建第5个学生student = new Student();student.setStudentIcon(R.drawable.img5);student.setStudentName("唐语涵");student.setStudentPhone("15967893450");// 将学生添加到学生列表students.add(student);// 创建第6个学生student = new Student();student.setStudentIcon(R.drawable.img6);student.setStudentName("郑智化");student.setStudentPhone("15867678904");// 将学生添加到学生列表students.add(student);// 创建第7个学生student = new Student();student.setStudentIcon(R.drawable.img7);student.setStudentName("童安格");student.setStudentPhone("13845674560");// 将学生添加到学生列表students.add(student);// 返回学生列表return students;}
}

安卓学习笔记24:常用控件 - 循环器视图相关推荐

  1. Qt学习笔记之常用控件QlistWidget

    一.QListWidget Class The QListWidget class provides an item-based list widget. More... Header: #inclu ...

  2. 安卓基础学习 Day 6|常用控件---列表视图+古诗查看

    目录 列表视图4要素 四种是适配器 古诗查看 古诗列表 1.主布局资源文件 2.诗歌列表项模板 3.字符串资源文件 4.主界面代码 5.启动应用.查看效果 古诗内容模板 1.内容模板的主布局资源文件 ...

  3. 【MFC】学习笔记:常用控件之组合框(Combo Box)

    01.目录 目录 01.目录 02.控件介绍 03.控件的消息通知函数 04.创建组合框控件及成员函数介绍 4.1 组合框的创建 4.2 CComboBox类的主要成员函数 05.应用实例 06.总结 ...

  4. Qt学习笔记之常用控件QTreeWidget

    一.QTreeWidget Class The QTreeWidget class provides a tree view that uses a predefined tree model. Mo ...

  5. 安卓常用控件--列表视图

    安卓常用控件--列表视图 (一)列表视图概述 1.继承关系图 2.列表视图API文档 3. 列表视图四要素 4.四种适配器 (二)数组适配器 1.数组适配器API文档 2.数组适配器继承关系 3.数组 ...

  6. 安卓学习笔记23:常用控件 - 网格视图与图像切换器

    文章目录 零.学习目标 一.网格视图 (一)概述 (二)继承关系图 (三)常用属性 二.图像切换器 (一)概述 (二)继承关系图 三.案例演示 - 选择水果 (一)运行效果 (二)涉及知识点 (三)实 ...

  7. 安卓学习笔记21:常用控件 - 列表视图

    文章目录 零.学习目标 一.列表视图概述 (一)继承关系图 (二)列表视图四要素 (三)四种适配器 二.基于数组适配器使用列表视图案例 -- 阅读古诗 (一)数组适配器 (二)运行效果 (三)涉及知识 ...

  8. vs2010 学习Silverlight学习笔记(7):控件样式与模板

    概要: 终于知道Silverlight--App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版...好强大的功能啊. 封装: 继续学习<一步一步学Silverl ...

  9. JavaFX 学习笔记——窗口与控件

    前言 如今比较流行的桌面gui框架有WPF.WinForm.Qt.javafx等.其中WPF和WinForm目前还只能在运行Winsows上.Qt(widget)是一个很强大的跨平台C++框架(不只是 ...

最新文章

  1. git commit之后,想撤销commit
  2. [转]在VS2008上安装WTL8.1时碰到的一些问题
  3. Pytorch学习:Task4 PyTorch激活函数原理和使用
  4. DBUtils、连接池
  5. core 包的核心类JdbcTemplate
  6. Android自定义View——可以设置最大宽高的FrameLayout
  7. 摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质
  8. 操作系统系列题型分析(更新中~)
  9. (40)System Verilog随机函数$random示例
  10. 计算机专业代码834,这六所高校更改专业课目录,其中不乏985高校,多数改为联考!...
  11. [转]bad interpreter:No such file or directory的原因
  12. PAT1040。有几个PAT
  13. SurfaceView浅析
  14. Windows Phone 7一周年生日
  15. 第 3 章 sqlmap - automatic SQL injection and database takeover tool
  16. 高光谱图像处理和分析软件(包含雷尼绍Renishaw wdf 文件导入解析功能)
  17. 基于51单片机---利用霍尔元件无接触式测量直流电机速度
  18. C# Xml序列化Dictionary
  19. 十大跑步运动耳机品牌有哪些,质量比较好的运动耳机品牌推荐
  20. 数据结构算法题:回文数的实现

热门文章

  1. 手把手带你写Node.JS版本小游戏
  2. 【华为云技术分享】五个Taurus垃圾回收compactor优化方案,减少系统资源占用
  3. 一文搞懂*argv和**kwargs
  4. Vue深入学习2—虚拟DOM和Diff算法
  5. 多个数字数组_九章算法 | 谷歌面试题:多个数组的交集
  6. Spark之SparkSQL数据源
  7. Android VideoView播放视频遇到的问题
  8. mint linux qq,linuxmint系统下安装QQ
  9. 【李宏毅机器学习】Unsupervised Learning - Word Embedding 无监督学习 - 词嵌入(p22) 学习笔记
  10. LeetCode-654. 最大二叉树