转角遇见她:RecyclerView(一)

前记

从5月9号换到新公司到现在有一个多月了,工作环境很好,公司前景也不错,关键是认识了好几位技术上的牛人,还和运营的几位同事成了很好的哥们,总之很满意也很有动力和紧迫感。这一个多月挺累,中间也没有更新博客,其实是有了很多可以写的知识点都是平时遇到的但没有那么多的时间好好总结,而我又不想将就随便写一篇凑数量,所以拖到了现在。以后尽量每周一到两篇,坚持下去,心态平和,不浮躁不浮夸。

言归正传,前一段时间在项目中遇到一个需求要展示大量数据,毫无疑问首先想到 ListView。结果,组里的大神说:「我用的都是 RecyclerView!」看来趋势这个东西是不能忽视的,所以我打算好好研究一下 RecyclerView,以便在后面的工作中使用它。鉴于知识点较多,我打算写三篇文章,这一篇只是做一个简单的介绍。

RecyclerView 出现的原因

RecyclerView 并不是凭空创造出来的,它是在原有 ListView 的基础之上完善起来的,将来也会慢慢代替 ListView 和 GridView。以前我们使用的都是 ListView,虽然强大但还是有硬伤:每次需要自己创建一个 ViewHolder 作为缓存实例用,同时还有需要手动判断是否有缓存 View。虽然代码量不大,但代码复用性不高,而这是我们一直尽力避免同时不断完善的动力之一。此时,RecyclerView 应运而生,从名字上我们就可以看出还是循环利用 View 的意思。对 ListView 源码感兴趣的可以看看 郭霖大神的关于 ListView 源码分析的文章:Android ListView工作原理完全解析,带你从源码的角度彻底理解。虽然以后用 ListView 会少,但分析源码永远都是不嫌多的。

RecyclerView 的优点

  • 强制定义封装了 ViewHolder 类型标准,避免初学者写出性能不佳的代码
  • 封装了 View 缓存判断逻辑,程序的健壮性更高
  • 强大的 LayoutManager 布局管理器,只需一行代码就能实现 ListView、GridView、瀑布流形式布局排版

// 1.获取控件,代码省略

// 2.设置布局方式为网格布局

mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 3));

mRecyelerView.setHasFixedSize(true);

// 3.设置 Adapter

  • RecyclerView.Adapter,比 BaseAdapter 做了更好的封装,BaseAdapter 中的 getView() 方法太臃肿,逻辑略显复杂,把 BaseAdapter 的 getView()方法拆分成 onCreateViewHolder() 方法和 onBindViewHolder() 方法

RecyclerView 的应用场景

  • 添加分割线
  • 添加点按效果
  • 列表动画(Github 上有大量第三方库)
  • 改变某个数据保持当前位置
  • 添加头部尾部
  • 列表分组
  • 各种效果集成 Demo

RecyclerView 的不足之处

  • 它没有设置处理 Item 点击事件 Listener 接口,而在 ListView 中有我们熟悉的 setOnItemClickListener接口
  • 它没有可以设置 Header 和 footer 的接口,当需要实现 Header View 时,需要根据 viewType 进行分类处理(暂时还没有很好的解决方案)

后记

这篇文章只是浅尝辄止,后面会继续深入分析,贴图上代码。一个多月没写了,感觉还真有点生疏了,写技术博客还真不是一件容易的事,尤其是高质量的文章,真不是一时半会随随便便就写出来的,需要坚持。persistence, patience。