2018-03-21 19:35 广州腾讯视频Android岗打来了面试电话…此次面试中发现了自己的薄弱与不足…甚至被问到一个从来也没有想过需要去比较的View…

最后一个问题:

  • 问:请问在项目开发中用过哪些布局?
  • 答:LinearLayout、RelativeLayout、自定义ViewGroup、FrameLayout、TableLayout、AbsoluteLayout六种布局
  • 问:自定义布局用过哪些?
  • 答:最常用的应该是RecyclerView
  • 问:能告诉我scollView和RecyclerView的区别吗?为什么RecyclerView可以替代scollView?
  • 我一脸茫然…

    这的确是我的知识漏洞…也曾比较过ListView和RecyclerView可从来没有想过要和scollview来做类比…面试后就做了这方面的功课..终于找到了一篇可以解决我心中困惑的文章

以前我们开发一个页面,几乎都是采用ScrollView作为父容器,然后在ScrollView中包含各个模块View

以如下页面携程为例,我将对这个编程框架进行讲解。

拿到一个需要新开发的页面,首先我们需要给这个页面分功能模块。把页面中每一个模块作为RecyclerView的一个item。在listView中把每个item设计为不同的结构时,代码写起来会特别冗余,结构会非常乱。而RecyclView本身一个很重要的特点就是可以实现多种类ITEM。给张图来解释一下,

使用RecyclerView来设计这样一个页面能解决加载慢和内存紧张的问题,因为RecyclerView本身就具有回收和延迟加载的特性。然而,对于这样功能复杂的RecyclerView,如果要是不设计一下结构,可想而知,这个代码维护起来得有多乱!!!因为RecyclerView的业务逻辑都是写在MainAdapter.java,要把这几种type的item都写在MainAdapter.java中,维护起来得多费劲!!

于是,我设计了这样一种结构。

我用红色圆圈圈起来的是程序的3个核心类:MainActivity、MainAdapter、AdapterViewHolderManager。

  • MainAcitivity用于组织业务逻辑。
  • MainAdapter是RecyclerView对应的Adapter。
  • AdapterViewHolderManager来管理所有的ViewHolder。可想而知,Adapter中有多少个type的item,就有多少个ViewHolder。

从思维导图中可以看到有个delegate文件夹,里面有每一种viewholder的delegate。其中,AdapterDelegate是每一种delegate都要实现的接口。由于现在编写程序都是数据驱动业务逻辑,model文件夹里就是每一种delegate对应的数据,而最终需要把每一种delegate的数据都放到一个list中,这就需要让每一个数据类都实现IIndependentTravelData接口。这里给出demo工程的文件结构。

现在,你无法想象本该代码很复杂的主Adapter中的代码结构有多清晰。

这里onBindViewHolder等方法里再也不需要写switch来判断不同的type,根据不同的type做相应操作了。为什么结构会如此清晰?这里用到了java的多态。在MainAdapter的构造方法里把每一个delegate的引用add到manager中,在四个实现方法里只需要调用manger.*对应的方法就可以了。

这样设计程序不光有结构清晰的特点,维护起来也非常容易。比如,我现在要调整一下每一个item的展示顺序,我只需要调整list中每个item的model顺序就可以了。

总结:在日常开发中的类似List长列表加载展示的使用非常多..并且不仅仅是单一的一种view进行循环加载数据填充..这时scollview相对于RecyclerView就变得非常不适用…当对scollview中进行不同view的填充就会影响整体性能和资源占用…

对于scollview这样的编程框架有以下两个缺点:

1、加载时间长。

2、占用内存大。

因为进入页面需要把全部模块都加载出来,这不但会需要很长的加载时间,而且单个页面如果占用内存过大,会使得页面非常卡顿,影响用户体验。

而我将RecyclerView代替ScrollView,并以RecyclerView作为基础,以增强可扩展性、灵活性为目标,并使得各模块间完全解耦。所以说,这个编程框架非常值得你来应用一下,目前我也在多个线上页面中采用了这种框架。