Android开发之漫漫长途 XVI——ListView与RecyclerView项目实战

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!


前言

Hello,大家好,有没有想我,这一个月没有更新文章,为什么呢,大声的告诉你,,我在...(准备面试 ps:南京)。至于怎么准备的,以及在面试中遇到的问题还有面试结果之类的,我们下面呢会挑一些与ListView和RecyclerView相关的内容说一下,至于其他的后文再说,毕竟不能打乱我们之前的行文安排(嗯,我就是这么一个十分有节操的人)。

我们上一篇说了些什么呢,RecyclerView,这个东西已经渐渐替代ListView成为我们Android开发工程师中常见的控件。按照上一篇的预告呢,我们本篇是来实战的。因为毕竟本地数据的展示基本上只能作为Demo,在实际的工作以及项目中,我们遇到的问题可能要比Demo复杂的多。

面试中遇到的关于ListView以及RecyclerView的问题

第一题 ListView的缓存复用机制

还是免不得笔试啊,,起码我面试的几家公司有80%让我答一份试卷,而且给你的时间与试卷的复杂度基本上对应不上。(无语。。。)不是说技术上有什么难点,不过你想完美的答出来,估计要写不少字,比如其中一题ListView的缓存复用机制。 关于ListView的缓存复用机制在

Android开发之漫漫长途 XIV——ListView

一文中有非常详细的解说,这边我们就不重复说了,如果你看过我的那一篇文章,你就明白,这个事情不花个半小时是讲不清楚的,更何况是写。所以我们在读书或者读别人博客的时候要善于总结,抓住核心。

第二题

上来打开一个界面,类似淘宝上的首页,问这个页面怎么布局?

请读者先稍微思考个5分钟再向下看。。。。。

我的思考过程是这样的

  1. 首先是根部局,根部局我在项目中用的最多的是LinearLayout、RelativeLayout、FrameLayout这些布局,不过明显这些根部局不符合滑动的条件,必须在其内部定义ScrollView,或者直接顶层就用ScrollView,
  2. 使用ScrollView作为顶层布局或者子布局
  3. 对于内部的列表子View显示可使用RecyclerView

直接说了,然后被打脸了,说是ScrollView的话对于含有大量Bitmap的很多View,滑动的话很容易造成OOM。有没有更好的方案。

然后面试官说了一句,可不可以考虑用RecyclerView作为根部局,然后嵌套RecyclerView呢,,我茅塞顿开,,然后就没有然后了。

其实我对于RecyclerView的理解陷入了一个误区,毕竟在项目中只是拿它做一些列表展示。完全没有想过用它作为布局的一种,其实也是对于RecyclerView的item type等相关知识理解的不够深入。如果用RecyclerView作为根部局虽然也有许多麻烦之处,但是它带来的好处也是很明显的。

注:我不清楚淘宝到底是怎么做的哈,,只是举例说明一下而已

第三题 ListView异步获取图片显示错位

关于这一题实际上是第一题ListView的缓存复用机制的一个实战题目,关于这个现象是如何产生的以及如何解决,郭神已经在其博客中深入分析了,我这里就不献丑了,读者可参看Android ListView异步加载图片乱序问题,原因分析及解决方案

小结

现在大多数商业内容性的App基本上都需要使用列表来展示,不管是使用比较老的ListView,还是正被广泛使用的RecyclerView,这两者都在面试中碰到过。现在来总结一下。

  1. ListView:对于ListView来说,考察最多的是关于ListView的性能优化(其原理也是ListView的复用机制),使用ViewHolder,然后在重写的getView方法中复用convertView,对于这两点可能大部分读者都了然于胸。当然还有更加直接的方式,如我碰到的第1题。
  2. 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给我。


下篇预告

下一篇呢,我会整理一下我的面试过程,,然后尽快分享出来,给大家做一个参考。



源码地址:源码传送门

此致,敬礼

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2i8hj5f9fj0gg

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LeoXu的博客

Android虚拟键盘挡住输入组件的解决办法 原

如题,一开始遇到这个问题,请教了做苹果开发的哥们(做苹果的哥们好说话),他说要做监听,打开键盘的时候把会被遮住的输入组件向上移动。

6310
来自专栏编程

033Python爬虫学习笔记-1从入门到爬取豆瓣书评影评

1.什么是爬虫 可以理解为抓取、解析、存储互联网上原始信息的程序工具,Google、Baidu底层都是爬虫。 2.为什么学Python和爬虫 从2013年毕业入...

346100
来自专栏phodal

RePractise前端篇: 前端演进史

细细整理了过去接触过的那些前端技术,发现前端演进是段特别有意思的历史。人们总是在过去就做出未来需要的框架,而现在流行的是过去的过去发明过的。如,响应式设计不得不...

30860
来自专栏知晓程序

这款小程序,想要和你一起「虚度时光」

一个人在家的时候,从来不敢在下午睡觉,因为,等你醒来,你就会发现屋内漆黑一片,屋外点点灯光,好像被世界抛弃了一样,孤独在那一刻表现的淋漓尽致。

8110
来自专栏HT

基于HTML5技术的电力3D监控应用(三)

继(一)和(二)之后不少,不少网友问我移动终端的使用问题,因为我们项目这次采用Android平板终端,所以我对这方面有点肤浅的研究,这篇分享些项目经验总结,希望...

21950
来自专栏hightopo

基于HTML5技术的电力3D监控应用(三)

15530
来自专栏Android机动车

手把手教你写高质量Android技术博客,画图工具,录像工具,Markdown写法

作为程序员,写博客是一件很有意义的事情,可以加深自己对技术的理解,可以结交更多的朋友,记录自己的技术轨迹,而且分享可以让更多的人从中受益,独乐乐不如众乐乐嘛。

20710
来自专栏牛客网

2017年终总结:秋招心路历程+安卓/java知识总结Android 知识点总结Java知识点总结

一直想写一篇年终总结的,但是又不知道写点什么,感觉没有什么可总结的,但是今年有很多事情还是值得回顾纪念的,之后再来看这些东西应该会感触颇多。2017对我来说是值...

45780
来自专栏廖可知的专栏

基于Redis实现排行榜周期榜与最近N期榜

我想要一个最近7天榜,反映最近一段时间的用户活跃情况,不想让历史的高分用户长期占据榜首,可否?

1.7K40
来自专栏儿童编程

《爱溜达的小黄猫》——儿童学编程Scratch2”运动(Motion)“部分

Scratch2非常容易上手,无论对儿童还是零基础的成年人来说,都非常有趣。操作起来就像搭积木一样简单有趣。也许你印象里的编程是满屏代码,不知所云。而这里,编写...

39750

扫码关注云+社区

领取腾讯云代金券