星期六,又是撸代码的一天
作为一个初级都算不上的小白,一步一个脚印的学吧,学一个记一个
今天记录的是RecyclerView

RecyclerView

  • 简述
  • 创建布局
    • 添加 RecyclerView和每个list布局(偏新手向,选择性跳过)
  • 创建适配器
    • 创建
    • onCreateViewHolder()
    • onBindViewHolder()
    • getItemCount()
  • 绑定适配器
    • 创建假数据
    • 绑定适配器
  • 适配器调整
    • 区别显示的实现
  • 点击事件

简述

官方解释为:提供一个固定的View让有限的窗口显示一个大数据集。(抄的)
我的理解是,和ListView差不多的东西
ListView是什么,不知道
总之,它可以呈现一系列数据,呈现方式可以根据给的LayoutManager确定

瀑布流(StaggeredGridLayoutManager)

列表流 (LinearLayoutManager)

表格流(GridLayoutManager)

使用方式在下面的 绑定适配器

创建布局

添加 RecyclerView和每个list布局(偏新手向,选择性跳过)

第一步当然是在xml中添加,在Palette中找到RecyclerView,右键Add添加

又或者在布局中写入Recy选择

这时需要给RecyclerView添加id

android:id="@+id/recycler"

然后根据开发需求,创建一个xml文件,我这里命名为recy_list.xml
作为单个list的布局,我这里模仿聊天界面做了个xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#cccccc"android:paddingTop="10dp"android:paddingBottom="10dp"android:paddingRight="20dp"android:paddingLeft="20dp"><ImageViewandroid:id="@+id/head"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="20dp"android:src="@android:mipmap/sym_def_app_icon" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"android:orientation="vertical"><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"android:text="小白"android:textColor="@color/black"android:textSize="16sp" /><TextViewandroid:id="@+id/news"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="14sp"android:textColor="#666666"android:text="今天搬了多少砖"/></LinearLayout><TextViewandroid:id="@+id/time"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="end"android:textColor="#999999"android:textSize="14sp"android:text="2021年4月24日\n19:02:50"/></LinearLayout>

最后在Activity绑定等等一系列操作

public class MainActivity extends AppCompatActivity {private RecyclerView recycler;//创建@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//初始化控件方法}private void initView() {recycler = findViewById(R.id.recycler);//绑定RecyclerView}

接下来进入重点,适配器

创建适配器

适配器Adapter,可以让开发者自定义recyclerview绑定的数据,通过上面创建的recy_list文件模板来创建一堆item

创建

  1. 创建一个Adapter类
  2. 继承RecyclerView的Adapte
  3. 泛型定义为Adapter的内部类MyHolder

具体是什么我也不知道,一堆复杂的词
大概就是这样

public class Adapter extends RecyclerView.Adapter<Adapter.MyHolder>  {@NonNull@Overridepublic MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return null;}@Overridepublic void onBindViewHolder(@NonNull Adapter.MyHolder holder, int position) {}@Overridepublic int getItemCount() {return 0;}
}

然后Alt+回车生成一堆Adapter的接口,同时MyHolder变红,这个不管它,先来看这三方法干啥的

onCreateViewHolder()

  • 创建ViewHolder时的回调函数
  • 传入 ViewGroup parent 和 int viewType
  • 返回 MyHolder

MyHolder是list中每个item
这里使用LayoutInflater布局加载器来加载view,再将view传给内部类MyHolder用于实例化

    private View view;//在外面定义一个view@NonNull@Overridepublic Adapter.MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {view = LayoutInflater.from(context)//实例化LayoutInflater//传参 刚才创建的recy_list.xml.inflate(R.layout.recy_list, parent, false);Adapter.MyHolder myHolder= new Adapter.MyHolder(view);return myHolder;}

(要传contect,挖坑)
来说一下LayoutInflater,菜鸟教程的解释 LayoutInflater(布局服务)

然后创建一个内部类MyHolder,继承ViewHolder ,在里面加上刚才的xml中的控件并绑定

  public class MyHolder extends RecyclerView.ViewHolder {TextView name, news, time;ImageView head;public MyHolder(View itemView) {super(itemView);name = itemView.findViewById(R.id.name);news = itemView.findViewById(R.id.news);time = itemView.findViewById(R.id.time);head = itemView.findViewById(R.id.head);}}

这时,第一个方法解决了!!

onBindViewHolder()

  • 绑定ViewHolder时的回调函数
  • 传入 自定义内部类的 holder 和 int position

激动人心的时候到了,终于绑定数据了

position
可以理解为list中item的下标,就像数组一样,每个item都有自己的标识
那数据怎么来,Adapter初始呗
新增构造方法,记得要传context,顺便加上成员变量

private Context context;
private ArrayList<String> nameList,newsList,timeList;public Adapter(Context context, ArrayList nameList ,ArrayList newsList ,ArrayList timeList) {this.context = context;this.nameList = nameList;this.newsList = newsList;this.timeList = timeList;}

然后在onBindViewHolder方法中写绑定,根据position来给各个控件设置

 @Overridepublic void onBindViewHolder(@NonNull ButViewHolder holder, int position) {//将数据和控件绑定holder.name.setText(nameList.get(position));holder.news.setText(newsList.get(position));holder.time.setText(timeList.get(position));}

就剩最后一个方法了

getItemCount()

没有传参,需要返回一个int
这个方法是控制创建item的条数,返回的就是条数
我这里直接给其中一个ArrayList的大小即可

 @Overridepublic int getItemCount() {return nameList.size();}

三个方法搞定了,意味着这个简单的Adapter已经写完了
然后就是让RecyclerView绑定Adapter

绑定适配器

在Activity那边加一个方法,或者直接在onCreate里绑定
setRecyclerView();

创建假数据

 ArrayList name = new ArrayList();ArrayList news = new ArrayList();ArrayList time = new ArrayList();for (int i= 0;i<20;i++){name.add("小白    " + i);news.add("今天搬砖了?");time.add("2021年4月24日\n19:17:04");}

绑定适配器

 //适配器RecyclerAdapter adapter = new RecyclerAdapter(this,name,news,time);//布局LinearLayoutManager manager = new LinearLayoutManager(this);//设置布局recycler.setLayoutManager(manager);//设置动画recycler.setItemAnimator(new DefaultItemAnimator());//设置适配器recycler.setAdapter(adapter);

就这样搞定了,这时运行项目就可以了看见本文开头那个列表流的效果了

适配器调整

都写到这了,再写一点吧

区别显示的实现

假如要给某一条item换上不同的背景
这时就需要在onBindViewHolder中修改
通过position,拿到ArrayList的某个数据进行判断
然后设置这个holder的某个控件的属性即可

点击事件

都九点半了,六千字,好累,写目录时加了这个,想删又不想删,还是写完再回家吧
Adapter点击事件的实现,需要声明View.OnClickListener接口
修改Adapter类,声明View.OnClickListener接口,加上一个onClick方法

public class Adapter extends RecyclerView.Adapter<Adapter.MyHolder>implements View.OnClickListener{@Overridepublic void onClick(View v) {}
}

想要点击不同的item时做一些不同的事,就又又又要修改onBindViewHolder
给itemView设置点击事件

@Overridepublic void onBindViewHolder(@NonNull ButViewHolder holder, int position) {//将数据和控件绑定holder.name.setText(nameList.get(position));holder.news.setText(newsList.get(position));holder.time.setText(timeList.get(position));holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {}});}

就这样???
如果我想在Activity中设置点击事件呢,比如跳转页面这种情况
添加点击事件接口,传值嘛
你想要什么就传什么,比如我想要点击的item的name,就传个name

 public interface OnItemClickListener {void onItemClick(String name);}

有接口,就要Activity那边实现,所以Adapter里新增一个方法
同时,接口里的方法需要传给成员变量

private OnItemClickListener mListener;public void setOnItemClickListener(OnItemClickListener li) {mListener = li;}

最后在绑定中的点击事件中添加

holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mListener.onItemClick(nameList.get(position));}});

这么说好像有些别扭
总结就是

  1. Adapter创建点击事件接口
  2. Activity实现接口
  3. 实现后的接口存入Adapter的成员变量
  4. 当点击item时,触发onBindViewHolder中设置的绑定事件
  5. 绑定事件执行的是 Activity中传给成员变量的方法

这时,点击事件已经完成,就这样吧,回家咯!
下次有时间写个加头或尾的文章类似于B站的独占一行方法

不要在意内容!!!

对本文有任何意见或疑问,或者认为其中说法有误,欢迎在评论区留言!!!
最后,转载请注明出处!!

RecyclerView简单使用(非常详细)相关推荐

  1. 如何用FFmpeg编写一个简单播放器详细步骤介绍

    如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...

  2. Rational Rose 2007简单介绍及详细安装步骤

    Rational Rose 2007简单介绍及详细安装步骤 Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具.用于可视化建模和公司级水平软件应用的组件构 ...

  3. Android 控件 RecyclerView简单使用

    Android 控件 RecyclerView简单使用 1.导依赖库 implementation 'com.android.support:recyclerview-v7:27.1.1'implem ...

  4. 在Python中安装GDAL(最简单,最详细图文教程)

    在Python中安装GDAL(最简单,最详细图文教程) 今天是2021年1月20日.为了安装在pythong中安装GDAL,我浏览了几十个网页,发现有99%都是垃圾,浪费了我非常多的时间.最后我安装成 ...

  5. makefile的使用方法(简单视频教程以及详细文字教程)

    文章目录 1.makefile详细文字教程 2.makefile简单教程(B站视频教程) makefile基本语法格式: 简单示例(单文件)makefile写法 带包含关系的多文件makefile写法 ...

  6. Android 第二十一课 RecyclerView简单的应用之编写“精美”的聊天页面

    1.由于我们会使用到RecyclerView,因此首先需要在app/build.gradle当中添加依赖库.如下: apply plugin: 'com.android.application' .. ...

  7. sumo的简单应用_sumo快速运行简单仿真实例详细教程

    本文旨在让大家快速的了解sumo,并给出运行一个简单的sumo的例子的教程,进而了解基本sumo工程的架构,使大家对该软件产生兴趣并持续学习下去,刚开始学习仿真的确枯燥,项目"跑起来&quo ...

  8. sumo快速运行简单仿真实例详细教程

    本文旨在让大家快速的了解sumo,并给出运行一个简单的sumo的例子的教程,进而了解基本sumo工程的架构,使大家对该软件产生兴趣并持续学习下去,刚开始学习仿真的确枯燥,项目"跑起来&quo ...

  9. android RecyclerView 简单实现横竖布局穿插

    关于RecyclerView 就不多说 ,鸿翔大神已经写的非常详细了. 先上图,主要实现效果(又有水平布局,又有垂直布局): 直接上关键代码: RecyclerView recyclerView = ...

最新文章

  1. 【iOS】NSDate分类,获得中国农历
  2. CCAI 2019 | Shai Ben-David:人工智能的可学习性能否判定?
  3. linux rmp命令安装包在哪里_rpm命令_Linux rpm 命令用法详解:RPM软件包的管理工具...
  4. linux mariadb 升级,linux mariadb
  5. 呆萌的图模型学习——使用networkx计算node2vec,得到节点与边的embedding(三)
  6. php 扩展 返回字符串,PHP扩展函数返回字符串一定需要使用spprintf吗?
  7. 1048. 数字加密(20)-浙大PAT乙级真题
  8. Executors中的几种线程调用方式
  9. Tosca 注意事项(持续更新)
  10. 如何进行影像建库及做ArcGIS Server Cache
  11. python文件怎么打开_py文件怎么打开?
  12. C语言 - 详解回调函数
  13. 顺丰快递:请签收MySQL灵魂十连问
  14. Excel,Word,PowerPoint2016通过命令行安装License过程
  15. 九章量子计算机 知乎,量子计算机《九章》问世 知乎微博消息: 北京时间 12 月 4 日凌晨 3 点,一篇重要文章以 First Releas... - 雪球...
  16. Beer Bill(签到题)
  17. 计算机应用中双绞线细铜线几根,《计算机应用基础_在线作业_E100.doc
  18. weboffice控件接收html文件,WebOffice 文档控件API
  19. 语音智能时代,我选择这个浪尖
  20. dspq值多少最好_抖音手机上怎么修改视频的md5值

热门文章

  1. Cascade Rcnn 的简单理解
  2. 记录一个关于universal reference, 我犯下的滔天大错。
  3. GPU — 分布式训练
  4. 2021年度工作总结
  5. 计算机管理里面的用户名是否可以导出,360浏览器管理保存过的账号和密码步骤教程...
  6. 99.9%的人不知道这个微信漏洞 ​
  7. JSP文件创建,虚拟目录访问
  8. 亲测好用的油管音乐播放器:Tuner Mac版
  9. 腾讯员工晒出薪资:真实 985 毕业薪资,大家看我还有救吗??
  10. 2021高考校考类成绩查询山东,教育知识:2021山东工艺美术学院校考成绩查询艺术校考成绩查询时间及入口...