Android开发之漫漫长途 XVI——ListView与RecyclerView项目实战
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!
前言
Hello,大家好,有没有想我,这一个月没有更新文章,为什么呢,大声的告诉你,,我在...(准备面试 ps:南京)。至于怎么准备的,以及在面试中遇到的问题还有面试结果之类的,我们下面呢会挑一些与ListView和RecyclerView相关的内容说一下,至于其他的后文再说,毕竟不能打乱我们之前的行文安排(嗯,我就是这么一个十分有节操的人)。
我们上一篇说了些什么呢,RecyclerView,这个东西已经渐渐替代ListView成为我们Android开发工程师中常见的控件。按照上一篇的预告呢,我们本篇是来实战的。因为毕竟本地数据的展示基本上只能作为Demo,在实际的工作以及项目中,我们遇到的问题可能要比Demo复杂的多。
面试中遇到的关于ListView以及RecyclerView的问题
第一题 ListView的缓存复用机制
还是免不得笔试啊,,起码我面试的几家公司有80%让我答一份试卷,而且给你的时间与试卷的复杂度基本上对应不上。(无语。。。)不是说技术上有什么难点,不过你想完美的答出来,估计要写不少字,比如其中一题ListView的缓存复用机制。
关于ListView的缓存复用机制在
一文中有非常详细的解说,这边我们就不重复说了,如果你看过我的那一篇文章,你就明白,这个事情不花个半小时是讲不清楚的,更何况是写。所以我们在读书或者读别人博客的时候要善于总结,抓住核心。
第二题
上来打开一个界面,类似淘宝上的首页,问这个页面怎么布局?
请读者先稍微思考个5分钟再向下看。。。。。
我的思考过程是这样的
- 首先是根部局,根部局我在项目中用的最多的是LinearLayout、RelativeLayout、FrameLayout这些布局,不过明显这些根部局不符合滑动的条件,必须在其内部定义ScrollView,或者直接顶层就用ScrollView,
- 使用ScrollView作为顶层布局或者子布局
- 对于内部的列表子View显示可使用RecyclerView
直接说了,然后被打脸了,说是ScrollView的话对于含有大量Bitmap的很多View,滑动的话很容易造成OOM。有没有更好的方案。
然后面试官说了一句,可不可以考虑用RecyclerView作为根部局,然后嵌套RecyclerView呢,,我茅塞顿开,,然后就没有然后了。
其实我对于RecyclerView的理解陷入了一个误区,毕竟在项目中只是拿它做一些列表展示。完全没有想过用它作为布局的一种,其实也是对于RecyclerView的item type等相关知识理解的不够深入。如果用RecyclerView作为根部局虽然也有许多麻烦之处,但是它带来的好处也是很明显的。
注:我不清楚淘宝到底是怎么做的哈,,只是举例说明一下而已
第三题 ListView异步获取图片显示错位
关于这一题实际上是第一题ListView的缓存复用机制的一个实战题目,关于这个现象是如何产生的以及如何解决,郭神已经在其博客中深入分析了,我这里就不献丑了,读者可参看Android ListView异步加载图片乱序问题,原因分析及解决方案
小结
现在大多数商业内容性的App基本上都需要使用列表来展示,不管是使用比较老的ListView,还是正被广泛使用的RecyclerView,这两者都在面试中碰到过。现在来总结一下。
ListView:对于ListView来说,考察最多的是关于ListView的性能优化(其原理也是ListView的复用机制),使用ViewHolder,然后在重写的getView方法中复用convertView,对于这两点可能大部分读者都了然于胸。当然还有更加直接的方式,如我碰到的第1题。
RecyclerView:对于RecyclerView来说,
比较简单的呢,碰到过对ItemDecoration 以及 如何添加HeaderView以及FooterView;
比较复杂的呢,碰到过直接让你复述RecyclerView的缓存复用机制,也有RecyclerView内几万甚至更多条数据为什么没有OOM这种间接的问法。另外也碰到了对比于ListView来说,RecyclerView的优势等等问题。(关于这些问题,我上一篇文章里也都提到,读者可参看 Android开发之漫漫长途 XV——RecyclerView);
我的TDK
这是我在Github上的一个小小的开源项目,项目地址在文末给出,难度也不大,主要是用来面试的时候用来展示的Demo。读者可以稍微看一下,涉及一下几个内容。
主界面如下所示
底部导航
使用Fragment进行导航切换,这部分内容可参看我之前关于Fragment的文章
RecyclerView的下拉刷新和上拉加载
这个使用的是BRAVH的开源库,关于更多使用指南,请参看官网http://www.recyclerview.org/
RecyclerView自定义LayoutManager
这部分内容可参看自定义LayoutManager 实现弧形以及滑动放大效果RecyclerView
Material Design 协调布局(CoordinatorLayout)
本篇总结
本篇呢是个实战项目,先是分享了面试中遇到的关于ListView以及RecyclerView的问题,然后分享了一个小Demo。只是抛砖引玉,读者呢可在我的博客下评论,分享一些面试中遇到的问题。另外Demo中也有很多部分都虚位以待,读者也可以提出一些功能点,提Issue或者Pull request给我。
下篇预告
下一篇呢,我会整理一下我的面试过程,,然后尽快分享出来,给大家做一个参考。
源码地址:源码传送门
此致,敬礼
Android开发之漫漫长途 XVI——ListView与RecyclerView项目实战的更多相关文章
- Android开发之漫漫长途 XIV——ListView
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 番外篇——内存泄漏分析与解决
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 XIII——Fragment最佳实践
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 XIV——RecyclerView
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 XV——RecyclerView
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>中的相关知识,再次表示该书 ...
- Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(2)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
随机推荐
- Java中用正则表达式找出数字
Java中用正则表达式找出数字 1.题目 String str = "fjd789klsd908434jk#$$%%^38488545",从中找出78990843438488 ...
- Linux显示系统日期
Linux显示系统日期 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ date 2015年 01月 21日 星期三 20:37:39 CST
- DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)
虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎 ...
- windows下键盘常用快捷键整理
以下快捷键均在win7环境下测试有效: 声明:本博文由多篇博文经实测整理而出. win键相关的快捷键多用于桌面场景,如开起资源管理器.切换任务窗口.最大化最小化窗口等等. 场景一: 1. 任何情况下想 ...
- Django学习-25-图片验证码实例
处理流程 用户请求网页 --> 后台发送登录界面的静态页面 --> 后台在内存中生成验证码 --> 验证码保存在用户对应的Session中 --> 返回验证码图片到前端 用户登 ...
- 摘抄--全面理解面向对象的 JavaScript
全面理解面向对象的 JavaScript JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或 ...
- html试题
1.水平线 要求:1)线左右宽度占屏幕70% 2)设置线的颜色 <html> <body> <h1>水平线</h1> <hr align=&quo ...
- es6中一些基本的使用方法
es6中一些基本的使用方法 const 定义常量 let 块级变量 用let定义的变量只在块当中起作用,离开变量外界的块(括号)就会被销毁. 模板字面量 用于字符串拼接和写模板,使用 ` (反引号,左 ...
- Python Cookbook(第3版)中文版:15.14 传递Unicode字符串给C函数库
15.14 传递Unicode字符串给C函数库¶ 问题¶ 你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode. 解决方案¶ 这里我们需要考 ...
- 安裝pycharm
一路按照這個教程走下來的.大體無誤. http://www.jianshu.com/p/042324342bf4 除了激活碼那裏,已經被cancel了,查找了很多辦法,最後發現衹要換成三個選項之一的 ...