ListView与RecyclerView的区别 ? Recyc
RecyclerView是Android5.0materials design中的组件之一,相应的还有CardView、Palette等。看名字我们就能看出一点端倪,没错,它主要的特点就是复用。我们知道,Listview中的Adapter中可以实现ViewHolder的复用。RecyclerView提供了一个耦合度更低的方式来复用ViewHolder,并且可以轻松的实现ListView、GridView以及瀑布流的效果。
今天我们首先来说为什么要介绍这个新组件RecyclerView,因为前几天我发布了一个常用面试题ListView的复用及如何优化的文章,介绍给一些开发者,但是我看到有关的反馈说:现在都不再用listview了,代替的是RecyclerView,确实是,但是用的毕竟是少数,所以可能很多人对于这个组件不是很了解,那么我们就来介绍一下吧!
1、什么是RecyclerView
RecyclerView 是Android-support-v7-21 版本中新增的一个 Widgets,官方对于它的介绍则是:RecyclerView 是 ListView 的升级版本,更加先进和灵活。
简单来说就是:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。
2、用RecyclerView注意哪些方面,怎么用
虽然RecyclerView充分考虑了它的扩展性,更好用,更灵活,但是用起来也有些麻烦。所以要使用RecyclerView,要好好考虑以下几点:
(1)、RecyclerView.Adapter
(2)、LayoutManager
(3)、ItemAnimator
第一点:RecyclerView.Adapter
RecyclerView.Adapter包含了一种新型适配器,其实与以前我们使用的适配器基本类似,只是稍微有所不同,比如viewholder它帮我们封装好了,不用像以前使用listview的适配器一样自己去写viewholder了。所以它的性能比以前应该好了不少。废话不多说了,适配器例子如下:
packagecom.pandastudios.pandastudios.adapter;
importandroid.support.v7.widget.RecyclerView;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TextView;
importcom.pandastudios.pandastudios.R;
importjava.util.List;
/**
* Created by loonggg on 15/7/18.
*/
public classMyAdapterextendsRecyclerView.Adapter {
privateListlist;
/**
* 这里和使用listview时使用的adapter基本一样,都是要传入数据集合的
*
*@paramlist
*/
publicMyAdapter(List list) {
this.list= list;
}
@Override
publicViewHolder onCreateViewHolder(ViewGroup viewGroup,inti) {
View view = View.inflate(viewGroup.getContext(), R.layout.rv_item,null);
ViewHolder holder =newViewHolder(view);
returnholder;
}
@Override
public voidonBindViewHolder(ViewHolder viewHolder,inti) {
viewHolder.tv.setText(list.get(i));
}
@Override
public intgetItemCount() {
returnlist.size();
}
public static classViewHolderextendsRecyclerView.ViewHolder {
publicTextViewtv;
publicViewHolder(View itemView) {
super(itemView);
tv= (TextView) itemView.findViewById(R.id.item_tv);
}
}
public voidadd(String item,intposition) {
list.add(position, item);
notifyItemInserted(position);
}
public voidremove(String item) {
intposition =list.indexOf(item);
list.remove(position);
notifyItemRemoved(position);
}
}
第二点:LayoutManager
这个LayoutManager类决定视图被放在画面中哪个位置,但这只是它的众多职责之一。它可以管理滚动和循环利用。LayoutManager只有一个叫做LinearLayoutManager的实现类,我们可以设置它的横向和纵向。
第三点:ItemAnimator
ItemAnimator简单来说是会根据适配器上收到的相关通知去动画的显示组件的修改,添加和删除等。它会自动添加和移除item的动画。自带的默认效果也不错,已经非常好了。
3、RecyclerView优点和缺点
优点:
RecyclerView本身它是不关心视图相关的问题的,由于ListView的紧耦合的问题,google的改进就是RecyclerView本身不参与任何视图相关的问题。它不关心如何将子View放在合适的位置,也不关心如何分割这些子View,更不关心每个子View各自的外观。更进一步来说就是RecyclerView它只负责回收和重用的工作,这也是它名字的由来。
所有关于布局、绘制和其他相关的问题,也就是跟数据展示相关的所有问题,都被委派给了一些”插件化”的类来处理。这使得RecyclerView的API变得非常灵活。你需要一个新的布局么?接入另一个LayoutManager就可以了!你想要不同的动画么?接入一个新的ItemAnimator就可以了,诸如此类等等。
缺点:
在RecyclerView中,没有一个onItemClickListener方法。所以目前在适配器中处理这样的事件比较好。如果想要从适配器上添加或移除条目,需要明确通知适配器。这与先前的notifyDataSetChanged()方法稍微有些不同。具体操作在适配器代码中就可以体现。
整体总结它的几点如下:
Adapter:包装数据集合并且为每个条目创建视图。
ViewHolder:保存用于显示每个数据条目的子View。
LayoutManager:将每个条目的视图放置于适当的位置。
ItemDecoration:在每个条目的视图的周围或上面绘制一些装饰视图。
ItemAnimator:在条目被添加、移除或者重排序时添加动画效果。