借着ActionBar说事儿~

借着ActionBar说事儿~

  虽然入行比较久了,但公司的产品需求一直用不上ActionBar,所以对这一块比较生疏。接着这次学习ApiDemos的机会,刚好熟悉一下。

一. 实现SwipeView
  磨刀不误砍柴工,先分析一下需求吧。

  • 交互
    • 滑动切换
    • 点击Tab切换
  • 显示
    • 滑动pager后,ActionBar应该将相应页切换到选中状态

  对于交互的两个需求,其实很好实现,使用ViewPager,给它set一个FragmentPagerAdapter就可以实现。

  在这里顺便说一下FragmentPagerAdapter和FragmentStatePagerAdapter吧。这两个Adapter都可以和ViewPager来配合使用,如果ViewPager中的页面数量固定,就可以使用FragmentPagerAdapter,该类的每个Fragment都会保存在内存中;如果数量不固定,数据动态性较强,占用内存较多,就可以使用FragmentStatePagerAdapter。

  这两个adapter之所以在使用上会有这种差异,是由于他们内部对fragment在内存上的管理机制不同。先来看看这两个adapter内部一些比较重要的方法吧。

  • getItemPosition(Object object)
    这个方法默认的是返回POSITION_UNCHANGED,如果某个object需要被销毁,就需要返回POSITION_NONE
  • instantiateItem(ViewGroup container, int position)
    每次ViewPager需要被调用时,就会调用这个方法。
    • FragmentPagerAdapter
      FragmentPagerAdapter在这个方法中会先小判断position对应的fragment有没有被创建,如果创建了,就调用attach(),不会调用getItem(),不会调用getItem();如果不存在,才会调用getItem()来生成一个新的fragment。
    • FragmentStatePagerAdapter
      FragmentStatePagerAdapter在这个方法中同样会判断position对应的fragment存不存在,但他和FragmentPagerAdapter不同,它是一个ArrayList<Fragment>中查询fragment存不存在,而FragmentPagerAdapter是从FragmentManager中查询。
  • getItem(int position)
    两个adapter的getItem()都是用来创建新的item的
  • destroyItem(ViewGroup container, int position, Object object)
    • FragmentPagerAdapter
      FragmentPagerAdapter的destroyItem()方法不会真的将Fragment销毁掉,而是调用detach()方法。
    • FragmentStatePagerAdapter
      FragmentStatePagerAdapter的destroyItem()方法会调用FragmentTransation.remove(),将fragment占用的资源释放掉。这也就是如果页面比较多,数据的动态性比较强,使用FragmentStatePagerAdapter就比较合理。

  记得以前曾经遇到一个很头疼的bug,那就是:调用pagerAdapter.notifyDataSetChanged()之后,页面的内容没有变化。后来弄了好久,终于发现了问题。原来我一直都是将动态载入数据的逻辑写在getItem()中了,而无论是FragmentPagerAdapter还是FragmentStatePagerAdapter,在instantiateItem()方法中只要发现fragment是存在的,就不会调用getItem()。发现了问题的所在,解决方案就出来了:

  • FragmentStatePagerAdapter
    如果使用的是FragmentStatePagerAdapter,其实有两种选择
    • 选择一:重写getItemPosition(),返回POSITION_NONE。这样一来,之后如果需要显示position对应的页面,fragment就会重新生成一次,其上的数据自然就是最新的数据了。
    • 选择二:重写instantiateItem(),在获得的fragment上做一些操作,这样也可以达到更新数据的目的。不过这样需要在fragment提供一些接口,可能代码量会略多一点。
  • FragmentPagerAdapter
    • 和FragmentStatePagerAdapter的选择二类似,就不再赘述了。

  扯得好远了-_-#,还是继续实现我们的SwipeView的效果吧。对于刚才的需求,我们已经实现了“滑动切换”,下面就来实现“点击Tab”切换。这个主要靠ActionBar来实现。

  ActionBar的功能,如果简单除暴一点归类,大概可以归为两类:一是显示,二是交互。(废话-_-#)

  • 显示
    • 显示logo, title之类的静态效果
    • 显示tab,searchView之类的动态效果
  • 交互
    • Navigation
    • 提供常用的功能模块

  将ActionBar存在的意义弄明白了,学习ActionBar就自然好学了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值