美文网首页
Android面试二

Android面试二

作者: pluto1617 | 来源:发表于2020-05-08 18:32 被阅读0次

 一 FragmentPagerAdapter 和 FragmentStatePagerAdapter 解析

a 第一次添加界面的时候,由于FragmentManager中没有这个Fragment,因此需要通过自定义的FragmentPagerAdapter获取,然后调用add方法,所走的生命周期为onAttach() -> onResume()。

b 移除界面时,使用的是detach方法,接触过Fragment的人都知道,这时候仅仅是Fragment的界面被从View树上移除了而已,它的实例仍然被保存在FragmentManager当中,所走的生命周期为onPause() -> onDestroyView()。

c 重新添加界面时,由于此时去FragmentManager中能找到那个Fragment,所以调用的是attach方法,也就是上面代码中的第(2)步,所走的生命周期为onCreateView() -> onResume(),并且不需要再从自定义的FragmentPagerAdapter中获取Fragment。

e FragmentStatePagerAdapter在移除页面的时候,调用的是remove方法,也就是说,FragmentManager中不再有这个Fragment的实例,所走的生命周期为onPause() -> onDetach()。

f 无论是添加页面还是重新添加页面,它是通过add方法,并且每次都会通过自定义的FragmentStatePagerAdapter子类的getItem方法来获取Fragment,所以它们内部的Fragment所走生命周期相同,都是从onAttach() -> onResume()。

g 对于ViewPager当前界面中所对应的Fragment,是通过一个mFragments列表来管理的,由于此时没有FragmentManager来帮我们实现Fragment集合的状态的保存和恢复,所以就需要我们自己实现onSave/onRestore方法来进行状态的保存和恢复。

总结

a FragmentPagerAdapter和FragmentStatePagerAdapter最大的区别就在于前者会把所有Fragment的示例都缓存在内存当中,而后者仅仅保存了ViewPager当前存在的页面所对应的Fragment,当页面被移除之后,这个Fragment的示例它也就不再保存了。

b 当然,在我们前面的例子中,虽然使用了FragmentStatePagerAdapter,但是由于我们在DemoActivity中用一个列表保存了所有的Fragment实例,因此它没有被回收,如果希望让页面被移除的时候,其对应的Fragment实例也被回收,那么我们的FragmentStatePagerAdapter的子类应

二 RecyclerView  对比ListView

1 为什么要使用RecyclerView

RecyclerView诞生的目的就是为了替代ListView,我们先总结一下在使用ListView过程当中所遇到的问题:

    1 复用Item需要编写很多的代码

    2 在使用ListView的时候,有经验的程序员一定会告诉你在getView中要这么写,如果忘了,那么会产生很严重的性能问题。

        if(convertView==null){//通过LayoutInflator生成convertView,并产生一个ViewHolder,通过setTag关联起来.      }else{//通过getTag获取       ViewHolder,进行更新操作.}

     3 焦点冲突问题

     当Item有焦点时,Item的子控件就无法获取到焦点;而如果子控件抢夺了焦点,那么Item的点击事件又不能响应,这个相信大家都遇到过。

    4 重复的API

    ListView中提供了很多的API,但是这些API又和View的一些API重复了,例如我们可以给ListView设置setOnItemClickListener,也可以在getView中给某个View设置setOnClickListener,这就让人很疑惑,到底应当选用哪个。

    5 动画

    当我们需要在ListView中进行添加、删除、移动等操作的时候,如果希望加上动画,那么是很困难的,根本原因是我们是通过Adapter通知ListView进行更新,然而ListView根本就没法确定到底是哪些View发生了变化。

    6 更加复杂的布局需求

    ListView在布局是规整的列表的时候能满足大多数人的使用,然而如果想要实现像瀑布流这种复杂的布局,并且保证View能够复用,那么需要编写很多的代码。

2从如果之前有了解过RecyclerView的基本用法,那么你会发现,对于上述这些问题,它都给出了自己的解决方案:

     1强制使用开发者使用ViewHolder,提供了onCreateViewHolder和onBindViewHolder这两个方法,把创建View和绑定View的操作分离开。

    2 把焦点交给系统处理。

    3 去掉了onItemClickListener,以及一些重复的API。

    4 在Adapter中增加了notifyItemChanged()等方法,让我们可以指定变化的类型和范围,并且提供了setItemAnimator()方法,让开发者能够方便地定义添加、删除、移动的动画。

    5 把布局的工作抽象出来,放到了LayoutManager当中,并预制了瀑布流布局。

3 RecyclerView架构

整个RecyclerView体系包含三大组件:

    LayoutManager:position the view

    ItemAnimator:animate the view

    Adapter:provide the view

3.1LayoutManager

LayoutManager需要负责以下几部分的工作:

3.1.1 Position 它负责View的摆放,可以是线性、宫格、瀑布流式或者任意类型,而RecyclerView不知道也不关心这些,这是LayoutManager的职责。

3.1.2 Scroll 对于滚动事件的处理,RecyclerView负责接收事件,但是最终还是由LayoutManager进行处理滚动后的逻辑,因为只有它在知道View具体摆放的位置。

3.1.3 Focus traversal 当焦点转移导致需要一个新的Item出现在可视区域中时,也是由LayoutManager处理的。

3.2Adapter

Adapter需要负责以下几部分的工作:

3.2.1 创建View和ViewHolder,后者作为整个复用机制的跟踪单元。

3.2.2 把具体位置的Item和ViewHolder进行绑定,并存储相关的信息。

3.2.3 通知RecyclerView数据变化,支持局部的更新,在提高效率的同时也有效地支持了动画。

3.2.4 Item点击事件的处理。

3.2.5 多类型布局的支持。

相关文章

网友评论

      本文标题:Android面试二

      本文链接:https://www.haomeiwen.com/subject/kvzfnhtx.html