关于RecyclerView的卡顿问题,对谷歌非常失望

希望这篇文章不要误导大家,现在基本清楚了,貌似将android:targetSdkVersion="21"就可以解决卡顿问题。而且经过几个版本的迭代,现在的RecyclerView也已经很流畅了。

RecyclerView控件自发布以来受到很多开发者的关注,因为它比ListView灵活,和Listview的最大不同点就是RecyclerView是通过layoutManager来决定自己的布局,因此RecyclerView可以完成各种各样的界面,而不仅仅是ListView。

网上也有很多人实践了RecyclerView并发表了相关文章,如RecyclerView使用介绍 一文就有比较完善的介绍,但是我觉得这些对RecyclerView的实践,大部分都没有应用到实际项目中,仅仅是做个用于学习交流的演示demo,因此RecyclerView的有些问题被严重忽略了,最近在阅读国外一篇关于使用RecyclerView实现拖动排序的文章之后发现,使用RecyclerView实现的列表在滑动的时候有严重的卡顿问题。

我们知道ListView如果不使用ViewHolder这种模型,如果item的布局稍微复杂点Listview的效果是非常不理想的,但是如果用ViewHolder优化下,ListView的流畅程度几乎可以和ios的UITableView媲美(参见ListView之BaseAdapter的基本使用以及ViewHolder模式 一文 )。按理说RecyclerView应该比ListView流畅才对,因为RecyclerView基本上是在控件的层面避免了ListView 创建过多子view和getView的时候频繁调用findViewById这两个问题。但是我今天运行发现RecyclerView虽然不至于说非常卡,已经说不上流畅了。

暂时没有找出RecyclerView卡顿的原因,但是从卡顿的表现上来看,貌似跟滚动的scrollbar 有关,在滑动RecyclerView的时候发现scrollbar并不知道当前滚动的具体位置,只有当一个item完全显示或者消失的时候scrollbar才会更新其位置,scrollbar在滚动过程中完全是跳着的,如果你把item的高度设置的很高,这个问题很容易看出来。

在stackoverflow搜RecyclerView smooth可以搜到几个关于这个问题的提问,貌似是说RecyclerView现在还不支持smooth scrollbars support。请注意RecyclerView并不是标准sdk中的控件,他只存在于support包中,即使是5.0的sdk,也没有RecyclerView控件,所以到目前为止RecyclerView还是个debug版本。但是ViewPager也从来没有被合并到sdk中,不是一直用的好好的么。

google居然允许如此重要的控件存在这种bug,实在是让人难以理解,难道要让人继续把android系统与卡出翔联系起来么。或者说这些问题继续留给开发者自己解决?虽说虚拟机给android带来了一定负担,不过造成android真正卡顿的原因恐怕还是应用层的问题。

另外虽然android l换成了art虚拟机,但是从实际使用来看,流畅度并没有任何提升,甚至不如4.4,我不怀疑art虚拟机的性能,怀疑的是跟RecyclerView一样,android5.0在应用层远远没有准备好。

对google这种不负责任的做法实在是太失望了!