简单使用:
ListView继承重写BaseAdapter类;
自定义ViewHolder与convertView的优化(判断是否为空);
RecyclerView继承重写RecyclerView.Adapter与RecyclerView.ViewHolder
设置LayoutManager,以及layout的布局效果
区别:
ListView的布局比较单一,只有一个纵向效果
RecyclerView的布局效果丰富,可以在LayoutMananger中设置:线性布局(横向纵向),表格布局,瀑布流布局,还可以在layoutMananger的API中自定义Layout(scrollToPosition(),findViewByPosition()等等)
空数据处理:
ListView中有个setEmptyView()用来处理数据为空的情况
RecyclerView没有这个API,需要进行数据判断来实现数据为空的情况
HeaderView与FooterView:
ListView通过addHeaderView()与addFooterView()来添加头部底部item,来实现上拉刷新下拉加载的情况,并不会影响Adapter的编写
RecyclerView没有这两个API,我们需要时可以在Adapter中自己编写,根据ViewHolder的Type与View来实现,但是这样会影响到Adapter的数据,添加了Header与Footer后实际的position会大于数据的position
局部刷新:
在ListView中刷新数据是用notifyDataSetChanged(),但是这种刷新数据是全局刷新的,每个Item的数据都会重新加载一遍,就会非常消耗资源
RecyclerView可以实现局部刷新,notifyItemChanged()
但是要在ListView实现局部刷新,我们可以在Adapter中实现一个onItemChanged(),在方法中获取这个item的position(可以通过getFirstVisiblePosition()),然后调用getView()来刷新这个item的数据
动画效果:
RecyclerView已经封装好API来实现动画效果,例如notifyItemChanged() notifyItemMoved(),如果需要自定义的动画效果可以通过相应的接口实现自定义的动画效果RecyclerView.ItemANimator类,然后调用RecyclerView.setItemAnimator()
ListView没有动画效果的实现,但我们可以在Adapter自己实现item的动画效果
Item点击事件:
ListView中有onItemClickListener(),onItemLongClickListener(),onItemSelectedListener(),但是添加HeaderView与FooterView就不一样了,HeaderView与FooterView都会算进position,就有可能抛出数组越界。
我们可以在getItemId()中通过返回id来标识相应的item;但是我们可以在Adapter中针对每个Item写在getView()中比较合适
Recycle让View中提供了addOnItemTouchListener() 监听item的触摸事件,我们可以通过RecyclerVIew的addOnItemTouchListener()加上Gesture Detector来实现类似ListView那样监听某个item某个操作方法。