概述
它是在android5.0之后推出的一个更强大,更灵活的控件,配合着CardView,可以实现比较美观的展示,可以说它是ListView的升级版,ListVie中我们需要自己写ViewHolder,当然你也可以不写,而在RecylerView中,是必须要写的。它同listView一样,当用户滑动使当前一个可视的Item滑出屏幕,这个Item的视图将会被回收并在一个新Item进入可视范围后重新被使用,可回收利用View是个很实用的功能,它不仅可以减少CPU不断inflate View的开销,而且可以节省缓存View的内存开销。
RecylerView的相关类
和ListView不一样的是,RecyclerView不再负责Item的摆放等显示方面的功能,而是通过功能类来实现与LIstView类似的效果,相对于LIstView,开发者可以自定义各种各样满足定制需求的的功能类,下面就是常见的公共类:
- RecyclerView.Adapter : 托管数据集合,为每个Item创建视图;
- RecyclerView.ViewHolder:承载Item视图的子视图;
- RecyclerView.LayoutManager:负责Item视图的布局;
- RecyclerView.ItemDecoration:为每个Item视图添加子视图,类似与LIstVIew的Divider(分割线);
- RecyclerView.ItemAnimator:负责添加、删除数据时的动画效果。
下面分别来看看各个功能类的实现效果:
RecyclerView.Adapter与RecyclerView.ViewHolder
Adapter负责扮演两个角色:不仅为底部数据提供支持而且还负责为数据创建合适的视图。
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainAdapterHolder> {
private List<ItemBean> mDataList;
public MainAdapter(List<ItemBean> dataList) {
this.mDataList = dataList;
}
@Override
public MainAdapterHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, null, false);
return new MainAdapterHolder(view);
}
@Override
public void onBindViewHolder(MainAdapterHolder mainAdapterHolder, int i) {
mainAdapterHolder.setDatas(mDataList.get(i));
}
@Override
public int getItemCount() {
return mDataList.size();
}
//Holder ,必须继承RecyclerView.ViewHolder
public class MainAdapterHolder extends RecyclerView.ViewHolder {
public MainAdapterHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
iv = (ImageView) itemView.findViewById(R.id.iv);
}
private TextView tv;
private ImageView iv;
public void setDatas(ItemBean bean) {
tv.setText(bean.desc);
iv.setImageResource(bean.id);
}
}
}
上面就是一个简单的adapter,注意谷歌要求必须要有holder,且要继承RecyclerView.ViewHolder类,进行视图的缓存。
onCreateViewHolder中负责为Item创建视图,onBindViewHolder负责将数据绑定到Item的视图上。
RecyclerView.LayoutManager
该类负责将每个Item