RecyclerView和ListView布局效果的对比:
Android默认提供的RecyclerView支持线性布局,网格布局,瀑布流布局三种。通过布局管理器来控制布局效果。
RecyclerView和ListView常用API对比:
ListView 的基础使用大家再熟悉不过,其使用的关键点主要如下:
继承重写 BaseAdapter 类
自定义 ViewHolder 和 convertView 一起完成复用优化工作
RecyclerView的使用步骤如下:
继承重写RecyclerView.Adapter和RecyclerView.ViewHolder,设置布局管理器,控制布局效果。
RecyclerView 相比 ListView 在基础使用上的区别主要有如下几点:
ViewHolder 的编写规范化了
RecyclerView 复用 Item 的工作 Google 全帮你搞定,不再需要像 ListView 那样自己调用 setTag
RecyclerView 需要多出一步 LayoutManager 的设置。
在最开始就提到,RecyclerView 能够支持各种各样的布局效果,这是 ListView 所不具有的功能,那么这个功能如何实现的呢?其核心关键在于 RecyclerView.LayoutManager 类中。从前面的基础使用可以看到,RecyclerView 在使用过程中要比 ListView 多一个 setLayoutManager 步骤,这个 LayoutManager 就是用于控制我们 RecyclerView 最终的展示效果的。而 LayoutManager 只是一个抽象类而已,系统已经为我们提供了三个相关的实现类 LinearLayoutManager(线性布局效果)、GridLayoutManager(网格布局效果)、StaggeredGridLayoutManager(瀑布流布局效果)。如果你想用 RecyclerView 来实现自己 YY 出来的一种效果,则应该去继承实现自己的 LayoutManager,并重写相应的方法,而不应该想着去改写 RecyclerView。关于 LayoutManager 的使用有下面一些常见的 API(有些在 LayoutManager 实现的子类中)
关于 LayoutManager 的使用有下面一些常见的 API(有些在 LayoutManager 实现的子类中)
canScrollHorizontally();//能否横向滚动
canScrollVertically();//能否纵向滚动
scrollToPosition(int position);//滚动到指定位置
setOrientation(int orientation);//设置滚动的方向
getOrientation();//获取滚动方向
findViewByPosition(int position);//获取指定位置的Item View
findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item位置
findFirstVisibleItemPosition();//获取第一个可见Item的位置
findLastCompletelyVisibleItemPosition();//获取最后一个完全可见的Item位置
findLastVisibleItemPosition();//获取最后一个可见Item的位置
空数据处理
ListView 提供了 setEmptyView 这个 API 来让我们处理 Adapter 中数据为空的情况,只需轻轻一 set 就能搞定一切。代码设置如下
mListView = (ListView) findViewById(R.id.listview);
mListView.setEmptyView(findViewById(R.id.empty_layout));//设置内容为空时显示的视图**重点内容**
而 RecyclerView 并没有提供此类 API,相应空数据页面要手动添加。
HeaderView 和 FooterView
在 ListView 的设计中,存在着 HeaderView 和 FooterView 两种类型的视图,并且系统也提供了相应的 API 来让我们设置。
Void addFooterView(View v,Object data,boolean isSelectable);
void addFooterView(View v);
void addHeaderView(View v,Object data,boolean isSelectable);
void addHeaderView(View v);
使用 HeaderView 和 FooterView 的好处在于,当我们指向在 ListView 的头部或者底部添加一个 View 的时候(例如:添加一个下拉刷新视图,底部加载更多视图),我们可以不用影响到 Adapter 的编写,使用起来相当方便。
RecyclerView 中,不包含类似 addFooterView 、 addFooterView 这种 API。
解决办法:1.就是在 Adapter 中提供三种类型(Header,Footer以及普通Item)的 Type 和 View,但是这种方法写起来很麻烦,对 Adapter 的影响很大,改动的代码量多并且也容易产生BUG。
2.张鸿洋:优雅的为RecyclerView添加HeaderView和FooterView 。实现思路是通过装饰者模式来扩充 Adapter 的功能,从而实现添加 HeaderView 和 FooterView,并且不影响 Adapter 的编写工作,牛逼的是还能支持多个 HeaderView 和 FooterView