一、RecyclerView介绍
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。
RecylerView在support-v7包中,是一个扩展性很强的滑动组件,也有回收复用功能。
RecylerView可以实现很多功能,例如,横向滚动,瀑布流等。
比如:有一个需求是屏幕竖着的时候的显示形式是ListView,屏幕横着的时候的显示形式是2列的GridView,此时如果用RecyclerView,则通过设置LayoutManager一行代码实现替换。
二、RecyclerView的优点
RecyclerView并不会完全替代ListView(这点从ListView没有被标记为@Deprecated可以看出),两者的使用场景不一样。但是RecyclerView的出现会让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。
比如:有一个需求是屏幕竖着的时候的显示形式是ListView,屏幕横着的时候的显示形式是2列的GridView,此时如果用RecyclerView,则通过设置LayoutManager一行代码实现替换。
RecylerView相对于ListView的优点罗列如下:
- RecyclerView封装了viewholder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
- 直接省去了listview中convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
- 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。
- 设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式
- 例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等)。也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。
- 可设置Item的间隔样式(可绘制)
- 通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去书写代码。
- 可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。
但是关于Item的点击和长按事件,需要用户自己去实现。
三、RecyclerView功能
1、基本功能
(1)Layout Manager:Item的布局,可以自由的切换不同的布局。例如:使用线性布局管理器
LinearLayoutManager manager=new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
RecyclerView提供了三种布局管理器:
LinerLayoutManager 以垂直或者水平列表方式展示Item
GridLayoutManager 以网格方式展示Item
StaggeredGridLayoutManager 以瀑布流方式展示Item
(2)Adapter:为Item提供数据。
class MyRecycleAdapter extends RecyclerView.Adapter{}
(3)Item Decoration:Item之间的Divider。
recyclerView.setLayoutManager(manager);
//分割线,相当于ListView每个Item之间的线,其实无所谓,在定义Item布局时候自己可以定义
recyclerView.addItemDecoration( new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
自己定义分割线需要继承RecyclerView.ItemDecoration 有如下方法:
onDraw(Canvas c, RecyclerView parent, State state),在Item绘制之前被调用,该方法主要用于绘制间隔样式。
onDrawOver(Canvas c, RecyclerView parent, State state),在Item绘制之前被调用,该方法主要用于绘制间隔样式。
getItemOffsets(Rect outRect, View view, RecyclerView parent, State state),设置item的偏移量,偏移的部分用于填充间隔样式,即设置分割线的宽、高;在RecyclerView的onMesure()
中会调用该方法。
(4)Item Animator:添加、删除Item动画。
//设置添加、删除、移动、改变的动画。
recyclerView.setItemAnimator(new DefaultItemAnimator());
还可以做下面的事情
- 上拉加载、下拉刷新
- 给列表添加头和尾
- 动画
- 点击事件(item点击及item的子控件点击)
- 分割线
- 拖拽排序和侧划删除
- 滑动及顶部标题透明度变化
- 复杂布局
- 卡片式Gallery效果
- 增加和删除条目
- 上下滑动、左右滑动
- GridView 上下滑动、左右滑动
- 瀑布流显示效果
二、实际应用
1、基本使用
+适配器
package com.lht.liuhaitao;
import android.app.Activity;
import android.support.v4.widget.SwipeRefreshLayout;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
static final String TAG="MainActivity";
private RecyclerView recyclerView;
private SwipeRefreshLayout swipeRefreshLayout;
private List lists;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.recycler_view);
swipeRefreshLayout=findViewById(R.id.swipe_regresh);
lists=buildData();
MyRecycleAdapter myRecycleAdapter=new MyRecycleAdapter(lists);
//布局管理器
LinearLayoutManager manager=new LinearLayoutManager(this);
//方向,当然不同的布局管理器会有不同的特性
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
//分割线
recyclerView.addItemDecoration( new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
//设置添加,删除,移动,改变时候item的动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
recycl