RecycleView
1.RecyclerView是什么?
RecylerView:是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥
有 item回收复用的功能,这一点从它的名字recylerview即回收view也可以看出。
2.RecyclerView的优点是什么?
根据官方的介绍RecylerView是ListView的升级版,既然如此那RecylerView必然有它的优点,现就
RecylerView相对于ListView的优点罗列如下:
①RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写
Adapter 面向的是ViewHolder而不再是View了,复用的 逻辑被封装了,写起来更加简单。
②提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecylerView专门抽取出
以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑
布流对应的还有StaggeredGridLayoutManager等),也就是说RecylerView不再拘泥于ListView的线
RecylerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。
③可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,
RecylerView有其自己默认的实现。
3.使用步骤:
3.1导入recyclerView-v7包
3.2在布局文件中添加一个RecycleView
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
3.3创建一个布局文件用来给每一个Item布局
3.4声明数据并与布局文件中的控件进行绑定
声明RecycleView对象
private RecyclerView recyclerView;
声明数据集合
private List<Map<String, Object>> mList;
3.5设置布局管理器格式
线性布局管理器
recyclerView.setLayoutManager(new LinearLayoutManager(this));
3.6 创建适配器
同ListView一样,RecyclerView只负责显示,而组建数据的任务,我们也需要一个Adapter来完成。
MyAdapter adapter = new MyAdapter();
适配器与RecycleView进行绑定
recyclerView.setAdapter(adapter);
创建适配器 :**Adapter需要继承自RecyclerView.Adapter**
在这里我们可以给Adapter一个泛型,这个泛型指定了该Adapter
所使用的ViewHolder,如果不指定泛型,则默认是RecyclerView.ViewHolder,
即自定义ViewHolder的父类
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHoler> {
重写3个方法
当需要拿到ViewHolder 的时候就会调用,返回值与之前的泛型相同,在加载不同类型的布局的时
候,可以根据ViewType来创建不同的ViewHolder
viewType是Item的数据类型
public MyViewHoler onCreateViewHolder(ViewGroup parent, int viewType) {
根据拿到的布局文件创建一个ViewHolder
View view =
LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item, null);
MyViewHoler viewHoler = new MyViewHoler(view);
return viewHoler;
}
当内容和布局进行绑定的时候回调这个方法,每当有新数据进入屏幕的时候,也会回调这个方法
参数holder和ViewHolder类型与泛型所规定的类型相同,
参数position代表的是该item的位置可以通过position来获取相应的数据
public void onBindViewHolder(MyViewHoler holder, int position) {
从数据列表中获取数据
String text = mList.get(position).get("text").toString();
int image = (Integer) mList.get(position).get("image");
将数据设置到界面上
holder.textView.setText(text);
holder.imageView.setImageResource(image);
}
返回数据的个数
public int getItemCount() {
return mList.size();
}
3.7创建ViewHolder
与ListView的ViewHolder不同,RecyclerView的ViewHolder需要
继承自**RecyclerView.ViewHolder**
class MyViewHoler extends RecyclerView.ViewHolder {
TextView textView;
ImageView imageView;
public MyViewHoler(View itemView) {
super(itemView);
进行控件关联
textView = (TextView) itemView.findViewById(R.id.textView);
imageView = (ImageView) itemView.findViewById(R.id.imageView);
}
}
**表格(GridLayoutManager)**
将线性布局管理器替换为表格布局管理器,就可以使用表格布局
recyclerView.setLayoutManager(new GridLayoutManager(this,3));
第一个参数:上下文
第二个参数:列数
GridLayoutManager(Context context, int spanCount, int orientation,
boolean reverseLayout)
第二个参数spanCount表示表格的行数或者列数;第三个参数表示是水平滑动或者是竖直方向滑动;
最后一 个参数表示是否从数据的尾部开始显示。
**瀑布流 (StaggeredGridLayoutManager)**
将线性布局管理器替换为瀑布流布局管理器,就可以使用瀑布流布局
recyclerView.setLayoutManager(new
StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
第一个参数是行(或列的数目)
第二个参数是滚动方向,如果为横向滚动,则每一个item的行高固定
如果为纵向滚动,则每一个item的列宽固定