一、背景
RecyclerView是谷歌官方出的一个用于大量数据集(或频繁更改的数据)列表展示的新控件,可以用来代替传统的ListView,它比传统的ListView更加强大和灵活。
如果有不了解的请先学习:
官方教程
最近公司项目也遇到这样的一个问题,关于是否要将ListView替换为RecyclerView?
我进行了一系列的对比和调查
功能
RecyclerView :RecyclerView的布局管理器中提供了
- LinearLayoutManager 线性布局管理器
- StaggeredGridLayoutManager 瀑布流布局管理器
- GridLayoutManager 网格布局管理器
ListView :
- 线性布局
使用中的差异
ListView
- 事件:
- setOnItemClickListener();
- setOnItemClickListener();
- 添加Header和Footer:
- addHeaderView() 和 addFooterView()
- 空布局
- setEmptyView()
RecyclerView
RecyclerView都没提供方法只能自己实现 ----实现方法↓:
- 事件:
- 接口回调方式实现
- addOnItemTouchListener回调方式实现
- 添加Header和Footer:
- 空布局
- 自己封装EmptyRecyclerView
刷新数据
ListView :
BaseAdapter中的刷新方法:
listView.png
*当然还有官方推荐的局部刷新ListView单条数据
private void updateSingleRow(ListView listView, long id) {
if (listView != null) {
int start = listView.getFirstVisiblePosition();
for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++)
if (id == ((Messages) listView.getItemAtPosition(i)).getId()) {
View view = listView.getChildAt(i - start);
getView(i, view, listView);
break;
}
}
}
RecyclerView
RecyclerView.Adapter中的刷新方法:
recycler.png
除了以上方法,在API 24的support-v7包中还提供了DiffUtil工具类比较新老数据集的差异,让RecyclerView更加高效的刷新
很显然RecyclerView有更加灵活的刷新方法,RecyclerView更适合大型数据集或频繁更改的数据
嵌套滚动机制
recy.png我们看到RecyclerView实现了NestedScrollingChild2接口
NestedScrolling是什么了?↓
https://blog.csdn.net/lmj623565791/article/details/52204039
缓存机制对比
https://segmentfault.com/a/1190000007331249
RecyclerView更加强大的地方
- ItemAnimator Item操作的动画
- ItemDecoration Item的间隔样式
总结
个人感觉RecyclerView的确是比ListView更加强大,
但是强大的前提是充满了大量的自定义功能,也使它更加的难用。建议还是根据自己的使用场景来选择是要用 RecyclerView 还是 ListView。
由于本人水平有限,如果有错误和需要改进的地方,还希望大家多多指教,共同进步。
网友评论