Android学习之RecyclerView带刺的玫瑰

Posted 楠来风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android学习之RecyclerView带刺的玫瑰相关的知识,希望对你有一定的参考价值。

上述小诗先逗比一下,接下来切入正题;

自从RecyclerView的诞生起,人们就为她贴上了高贵的标签;她灵活华丽高度可定制,而另一边ListView确已是明日黄花;人们趋之若鹜的奔向了RecyclerView赞美她吹捧她似乎一切的一切都尽在他们的掌握中;各大技术论坛开始讲解RecyclerView是多么的好用;于是乎我也加入了使用RecyclerView的行列中,哦不!是混入了;

初识RecyclerView

说实在的我不愿意从头开始讲解她是如何工作,如何建立Adapter;因为早就有人写了相关用法的文章;再此我也不会赘述,我就当你会基本的用法了;如果还不知道她的基本用法可移至AndroidRecyclerView 使用完全解析 体验艺术般的控件,正所谓前人种树后人乘凉相信我们也从这些前辈的博客中学到了不少;

使用流程大概总结如下:

设置RecyclerView的布局管理器:

RecyclerView.setLayoutManager(layout);

LinearLayoutManager:线性布局通常就是替换ListView布局

GridLayoutManager:表格布局通常就是替换GridView布局

StaggeredGridLayoutManager:这个布局比较灵活可以用来替换ListView,GridView还可以做出瀑布流的效果;

设置Adapter

RecyclerView.setAdapter(adapter)

设置增加删除动画

RecyclerView.setItemAnimator(new DefaultItemAnimator());

设置分割线

RecyclerView.addItemDecoration(new DividerItemDecoration(

view source print ? 1. getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

(ps:分割线我觉得可以设置视图的margin来实现,或者自己添加边框;用这种方式做分割线反而是个累赘,当然还是根据实际情况来;)

RecyclerView你真的会用了吗?

看过不少RecyclerView的例子,大多是一些静态的测试环境;这样一看我们会认为RecyclerView果真是个好东西;于是乎我也心动了,我在上一篇文章中Android学习之优化美女图片浏览器中使用了GridView决定要替换为 RecyclerView并实现瀑布流的效果;想想还是有些小激动的,替换实现之分分钟搞定,下面是测试截图;

ScreenShot


美丽的背后总是隐藏着不为人知的故事

看了RecyclerView的使用后,我分分钟加入了上次写的项目中,本以为可以万事大吉;但是结果总是不会差强人意;当然我也怀疑过也会质疑应该没那么简单,果真遵循了墨菲定律;索性程序还是跑起来了,至少没有崩溃(ps:其实崩溃才是最好解决,哈哈:)

下面进入看图说话

上面两幅图中分别出现了两个bug

通过notifyDataSetChanged()方法后滑动到顶部图片会出现移位的效果

下拉到底部自动加载的时候全屏图片闪动(ps:相信看了我上一篇文章的同学已经知道如何避免下拉加载时整个页面闪动的问题,这里我同样采用了那种方式却失败了)

阳光总在风雨后,让我们一探究竟

由于上面的两个bug,我们已经猜出了个大概;可能得原因视图在刷新后相同位置的视图对象被替换了,这样导致他内部存储的唯一标识改变了;

下面我将对ListView和RecyclerView进行一个比较:

测试代码如下,我打印对象id看相同位置的TextView对象是否一致;

RecyclerView测试

view source print ? 01. public void onBindViewHolder(MyViewHolder holder, 02.   03. final int position) 04.   05. if (position == 0) 06.   07. Log.e(TAG, 'position:' + position + ' tv:' + holder.tv.toString()); 08.   09. else  10.   11. Log.i(TAG, 'position:' + position + ' tv:' + holder.tv.toString()); 12.   13. 14.   15. holder.tv.setText(mDatas.get(position)); 16.   17.   18.   19.

还是进入看图说话,我经过两次刷新视图得到如上图的log信息;你会发现视图没有移动,只是刷新之后相应位置的TextView对象都已经改变了,我想这种情况我是不能容忍的;心中有万千草泥马奔腾而来,Google怎么会犯如此问题呢?(ps:哈哈,我也想是Google的问题,但是往往是我们自己的问题)

ListView测试

view source print ? 01. public View getView(int position, View convertView, ViewGroup parent) 02.   03. ViewHolder holder = null; 04.   05. Android学习之Recyclerview

Android Material Design学习之RecyclerView代替 ListView

Android学习之基础知识五—编写聊天界面

Android学习之Fragment的各种实现功能(头部折叠,循环列表RecyclerView,左右滑动ViewPager)

Android学习之Fragment的各种实现功能(头部折叠,循环列表RecyclerView,左右滑动ViewPager)

Android学习之Fragment的各种实现功能(头部折叠,循环列表RecyclerView,左右滑动ViewPager)