有关内容
- Adapter
- LayoutManager
- itemDecoration
- ItemAnimatorr
- ItemTouchHelper
了解RecyclerView
- RecyclerView封装了viewholder的回收复用,编写Adapter面向的是ViewHolder而不再是View
- 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对每一个Item的显示,RecyclerView专门抽取了相应的类,使其扩展性非常强。
- 设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式。
- 可设置Item的间隔样式(可绘制)。
- 可以控制Item增删的动画。
RecyclerView控件是Android 5.0,谷歌公司推出的,是support-v7包中的新组件,所以当我们要使用该控件时,首先需要在项目的build.gradle中添加相应的依赖库
RecyclerView控件是Android 5.0,谷歌公司推出的,是support-v7包中的新组件,所以当我们要使用该控件时,首先需要在项目的build.gradle中添加相应的依赖库
RecyclerView的相关类
- RecyclerView.Adapter:可以托管数据集合,为每一项Item创建视图并且绑定数据
- RecyclerView.ViewHolder:承载Item视图的子布局
- RecyclerView.LayoutManager:负责Item视图的布局的显示管理
- RecyclerView.ItemDecoration:画分割线
- RecyclerView.ItemAnimator:负责处理数据添加或者删除时候的动画效果
RecyclerView的基本使用步骤
- 获取RecyclerView控件
RecyclerView recyclerView = ( RecyclerView) findViewById(R.id.xxx)
- 给获取的RecyclerView设置布局管理器
- 创建并设置自定义适配器
- 将RecyclerView与自定义的适配器的对象绑定
Adapter
- 创建View和ViewHolder,后者作为整个复用机制的跟踪单元。
- 把具体位置的Item和ViewHolder进行绑定,并存储相关的信息。
- 通知RecyclerView数据变化,支持局部的更新,在提高效率的同同时也有效的支持动画。
- Item点击事件的处理。
- 多类型布局的支持。
自定义适配器
- 继承于RecyclerView.Adapter
- 构造函数
初始我们想要展示的数据
- 创建内部类ViewHolder(View view)继承于RecyclerView.Adapter
这个内部类用来获取RecyclerView中每个Item的布局以及和它相关联的数据,同时也是RecyclerView.Adapter中需要指定的VH类型 - 实现抽象方法
- onCreateViewHolder(ViewGroup parent, int viewType)
当RecyclerView需要我们提供类型为viewType的新ViewHolder时,会回调这个方法。
在这里,我们实例化出了Item的根布局,并返回一个和它绑定的ViewHolder。
- onBindViewHolder(VH viewHolder, int position)
当RecyclerView需要展示对应position位置的数据时会回调这个方法。
通过viewHolder中持有的对应position上的View,我们可以更新视图。
- getItemCount()
返回Item的总数。
LayoutMannager
- Position:负责view的摆放,线性、宫格、瀑布流式或者任意类型
- Scroll:处理滚动事件,RecyclerView负责接收事件,最终由LayoutManage处理滚动后的逻辑,因为只有它知道View的具体摆放位置。
三种布局管理器
- 线性布局,横向或者纵向滑动列表
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
- 表格布局
GridLayoutManager layoutManager=new GridLayoutManager(this,4);
- 瀑流式布局
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
RecyclerView的点击事件
先获取点击的数据元素的postion,再通过position获取被点击的Fruit的实例,然后通过toast显示被点击的实例的内容。
自定义REcyclerView的Item间分割线
- 通过方法引入addItemDecoration方法就可以画出默认分割线
- 如果要画出自定义分割线,就要在drawable下新建一个xml文件,然后在values文件下styles.xml文件中用之前新建的xml文件替换RecyclerView自带的listDivider
- 自定义ItemDecoration.
数据更新
- 数据更新分为两种
-
- 除了Item所对应的数据被更新外,没有其他变化使用, notifyXXXChanged()。
-
- 位置变化:Item在数据集中被插入、删除或者移动,使用notifyXXXInsert/Removed/Moved()方法。
-
- 局部的刷新
notifyItemChanged(int postion) //position的数据变化 一条数据
notifyItemInserted(int position) //在position的下方插入了一条数据
notifyItemRemoved(int postion) //移除了position的数据
notifyItemRangeChanged(int postion, int n) //从position开始,往下n条数据发生了改变 notifyItemRangeInserted(int position, int n) //从position开始,插入了n条数据 notifyItemRangeRemoved(int postion, int n) //从position开始,移除了n条数据
- 整体刷新
notifyDataSetChanged()会吧当前所有的Item和结构都视为已经失效的,因此它会让LayoutManager重新绑定Item,并对它们重新布局。
ItemAnimator动画
- RecyclerView提供了默认的ItemAnimator实现类:DefaultitemAnimator如果没有特殊的需求,默认使用这个动画即可。
mRecyclerView.setItemAnimator(new DefaultitemAnimator());
- RecyclerView的Item增添删除
- 在Adapter里面添加方法实现相应逻辑:list数组的add/remove方法的调用;
界面的刷新
- 在Adapter里面添加方法实现相应逻辑:list数组的add/remove方法的调用;
addItem(int position) //在position下面增添一个Item
removeItem(int position)//删除position的Item
- 相应的点击事件